这似乎是一个特别晦涩的一点,但是我正在尝试改进我对
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; }
对象2
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中的一些最佳做法?
先谢谢你们.
编辑:感谢您的反馈 – 正如有些人所提到的,我进一步的测试似乎表明这个问题是浏览器(或者更确切地说,Javascript编译器具体).我已经在Safari,IE 10和Firefox中另外测试过. IE 10和Firefox都给出了非常接近的结果,没有什么不同. Safari执行Object2上的操作比Object1上的操作稍快一些(平均约为2%).我想知道什么是异常值(Other),因为这种情况下的性能差异似乎很大.
解决方法
当你声明一个函数时,它的prototype属性被初始化一个包含默认构造函数的对象.
使用Object1,您将添加一个属性到现有的原型函数.
使用Object2,您将使用自己的构造函数替换现有的原型.
两者不一样.
为什么速度不同?那么,V8可以在每次创建一个实例时为你的object2原型添加一个构造函数.
或者更有可能的是,在机器代码中实现了预先存在的原型功能,使其更快,当您将自己的对象分配给Object2.prototype时,原型函数现在是纯JavaScript,因此更慢.
细节并不那么重要,因为不同的口译员会以这种不同的方式处理,重要的是意识到Object1和Object2不完全一样.