我试图理解Prototype函数和嵌套函数之间的区别。 我需要知道以下
我的基本用法: 我的基本用法是我想为web应用程序编写一个主要功能,在启动时,它会在应用程序导航期间创建菜单,按钮,按钮点击事件,绘制图表,制作表格等,我需要将代码更好地构建和最快的方式。我将使用jquery及其插件 * 。
为了简化使用,请考虑我需要在may app中的许多地方/阶段创建portlet / widget容器,我只需要调用var port = App.creatPortlet()
然后调用port.content(// place data)
请帮助。
性能: 我在这里创建了性能测试prototype-vs-nested-function,似乎 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();
NESTED FUNCTION:
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。
答案 0 :(得分:3)
首先,针对如此小部分代码的性能测试并不是很有用,因为您不知道这是否会反映实际用例场景中的性能。 (可能会发生这种小代码测试JS引擎的优化器,例如内联某些方法或触发JS引擎的优化过程,这需要更长的时间来初始化,但会在实时应用程序中带来性能提升,你发现了测试库的缺陷,....)
我打赌你不要在这里测试原型 vs 嵌套函数,但两个作业 vs 范围处理
看看你的测试,你甚至都不测试这两种情况。您只需测试案例二(在准备中,您使用Person
覆盖对名称函数var Person = ...;
的访问权限,因此您的测试中从不使用function Person
。它应该如下所示:updated jsperf.com。
(编辑看起来你在我写作的时候已经改变了自己。)
无论如何,有什么不同,有什么更好。两者都有有效的用例,由你决定什么是更好的。
对象类型
对于第一个,Person
创建的每个对象都是相同的类型:
var p1 = new Person();
var p2 = new Person();
console.log( p1 instanceof Person); //true
console.log( p2 instanceof Person); //true
在第二个示例中,您创建的每个对象都是Object
类型
因此,如果对象是第一个传递给另一个函数,则可以测试它是否为Person
类型,而对于第二个函数,则可以测试。
虽然我更喜欢测试功能/功能的存在而不是测试类型,但这对我来说没有区别。
原型链
有时更新/扩展所有对象的功能或修改/扩展一种类型的所有对象的现有函数是有用的。
虽然这对于第一个例子是可能的,但是第二个例子是不可能的。
var Person = function() {
};
var p1 = new Person();
Person.prototype.doSomething = function() {console.log("....");};
p1.doSomething();
重复使用代码
使用第一个示例,您可以在与给定对象类似的对象上重用您的函数。你可以这样做:
Person.prototype.doSomething.call(similarOBject, ...);
在某些情况下这可能很方便。通常使用的示例是数组上的Array
函数,例如对象。
保护原始数据
有时保护某些 raw 数据不被直接读取/修改是有用的。
那就是第二个例子的力量。虽然我个人认为这应该由一个好的文档处理,而不是通过代码强制它,它仍然是一个有效的用例。
在您的示例中,firstName
和lastName
在外部完全隐藏,但创建Person
的代码部分除外。
效果和速度
哪一个在速度和内存使用方面表现更好,主要取决于JS引擎。 并非每个引擎都会为嵌套函数创建一个新函数,它更有可能被正确检测到,并且只是在第二次调用时引用。范围创建会有一些开销,但这可能是微不足道的,具体取决于对象数量以及创建它们的频率。
但正如已经说过的,你很可能会在你的代码中有其他东西会造成瓶颈。
在大多数情况下,使用prototype
是更好的选择,具有可维护性和可读性。