这似乎是一个特别模糊的观点,但我试图提高我在整个Javascript语言中的基础(更具体地说,它是最好和最有效的实践)。
在http://jsperf.com/中测试理论时,我得出了一些奇怪的结果:
假设我们有两个“相同”的原型,定义如下:
Object1
var Object1 = function() {}
Object1.prototype.defaults = {
radius: 400,
up: 1
}
Object1.prototype.centerOffset = function() {
return this.defaults.radius*this.defaults.up;
}
Object2的
var Object2 = function() {}
Object2.prototype = {
defaults: {
radius: 400,
up: 1
},
centerOffset: function() {
return this.defaults.radius*this.defaults.up;
}
}
Object1 在执行以下简单操作时具有与 Object2 相比的一致(如果边际:~3%)速度优势:
var o = new Object1();
var offset = o.centerOffset();
&安培;
var o = new Object2();
var offset = o.centerOffset();
您可以自己运行测试here。我在OSX 10.6.8上使用Chrome 25。
我想知道的是:
先谢谢你们。
编辑:感谢您的回复 - 正如一些人所提到的,我的进一步测试似乎表明这个问题是浏览器(或者更确切地说,是Javascript编译器特定的)。我还在Safari,IE 10和Firefox中进行了测试。 IE 10和Firefox都给出了非常接近的结果。 Safari对Object2执行的操作比Object1上的操作略快(平均约为2%)。我想知道异常(其他)是什么,因为在这种情况下的表现差异似乎很大。答案 0 :(得分:3)
声明一个函数时,它的prototype属性是用一个包含默认构造函数的对象初始化的。
使用Object1,您将向现有原型函数添加属性。 使用Object2,您将使用自己的构造函数替换现有原型。
这两者并不相同。
为什么速度不同?好吧,V8可能会在每次创建实例时向object2原型添加构造函数。
或者更可能的是,预先存在的原型函数在机器代码中实现以使其更快,当您将自己的对象分配给Object2.prototype时,原型函数现在是纯javascript,因此更慢。
细节并不重要,因为不同的解释器会以不同的方式处理,重要的是要意识到Object1和Object2并不完全相同。
答案 1 :(得分:0)
我认为你在Object1中附加原型并在Object2中覆盖它有一些东西。为了验证,我做了第二个性能示例:http://jsperf.com/correct-way-to-declare-prototype-functions/2
我在分配函数之前添加了“Object1.prototype = {}”。现在,Object1和Object2之间的性能大致相同(至少在chrome中)。