- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想了解原型(prototype)函数和嵌套函数之间的区别。我需要知道以下内容
我的基本用法:我的基本用法是我想为网络应用程序编写一个主要功能,启动时,它将在应用程序导航期间创建菜单、按钮、按钮单击事件、绘制图表、制作表格等,我需要我的代码以更好的方式构建和最快的方式。我将大量使用 jquery 及其插件*。
为了使用简单,考虑到我需要在应用程序的许多地方/阶段创建 portlets/widget 容器,我会调用 var port = App.creatPortlet()
然后 port.content(//放置数据)
请帮忙。
性能:我在这里创建了性能测试 prototype-vs-nested-function而且看起来 PROTOTYPE 函数 更快。但我需要一些建议。
原型(prototype)函数:
function Person(opt) {
this.firstName = opt.firstName;
this.lastName = opt.lastName;
}
Person.prototype.getFullName = function() {
return this.firstName + " " + this.lastName;
};
// Testing performance
var P1 = new Person({
firstName: 'Jeremy',
lastName: 'McPeak'
}).getFullName();
嵌套函数:
var Person = function(opt) {
return {
getFullName: function() {
return opt.firstName + " " + opt.lastName;
}
};
}
// Testing performance
var P1 = new Person({
firstName: 'Jeremy',
lastName: 'McPeak'
}).getFullName();
更新: http://jsperf.com/closure-prototype-static-reveal我根据自己的具体需要创建了 benchamrk。
最佳答案
首先,对这么小的代码部分进行性能测试并不是很有用,因为您不知道这是否会反射(reflect)实际用例场景中的性能。(可能会发生你测试 JS 引擎优化器的小代码,例如一些方法的内联,或者你触发了 JS 引擎的优化过程,这将花费更长的时间来初始化但会带来实时应用程序的性能提升,那你检测到测试库的缺陷,....)
我打赌你不会在这里测试原型(prototype)与嵌套函数,而是测试两个赋值与作用域处理。
看看你的测试,你甚至没有测试这两种情况。您只需测试案例二(在您的准备工作中,您使用 var Person = ...;
覆盖了对名称函数 Person
的访问,所以 function Person
从未在您的测试中使用过)。它应该是这样的:updated jsperf.com .
(EDIT 看起来你在我写的时候已经改变了自己)。
无论如何,有什么区别,什么更好。两者都有有效的用例,由您决定哪个更好。
对象类型
对于第一个,Person
创建的每个对象都是同一类型:
var p1 = new Person();
var p2 = new Person();
console.log( p1 instanceof Person); //true
console.log( p2 instanceof Person); //true
虽然在第二个示例中,您创建的每个对象都是 Object
类型。
因此,对于第一个你,如果对象被传递给另一个函数,你可以测试它是否属于 Person
类型,而对于第二个你不能。
虽然我更喜欢测试特性/功能的存在而不是测试类型,但这对我来说没有区别。
原型(prototype)链
有时更新/扩展所有对象的功能或修改/扩展一种类型的所有对象的现有功能很有用。
虽然这对于第一个示例是可能的,但对于第二个示例是不可能的。
var Person = function() {
};
var p1 = new Person();
Person.prototype.doSomething = function() {console.log("....");};
p1.doSomething();
代码重用
在第一个示例中,您可以在与给定对象相似的对象上重用您的函数。你可以这样做:
Person.prototype.doSomething.call(similarOBject, ...);
在某些情况下这可能很方便。一个经常使用的例子是 array like 对象上的 Array
函数。
原始数据的保护
有时保护一些原始数据不被直接读取/修改是很有用的。这就是第二个例子的优势。虽然我个人认为这应该由一个好的文档来处理,而不是通过代码强制执行,但它仍然是一个有效的用例。在您的示例中,firstName
和 lastName
对外部完全隐藏,除了创建 Person
的代码部分。
性能和速度
哪个在速度和内存占用上表现更好主要取决于JS引擎。并非每个引擎都会为嵌套函数 创建一个新函数,它更有可能被正确检测到并仅在第二次调用时引用。创建作用域会有一些开销,但这可能可以忽略不计,具体取决于对象数量和创建它们的频率。
但如前所述,您的代码中很可能还有其他会造成瓶颈的东西。
在大多数情况下,考虑到可维护性和可读性,使用prototype
是更好的选择。
关于javascript - js jquery 原型(prototype)函数与嵌套函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19218016/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!