我做了一个简单的对象创建基准。我知道“有谎言,该死的谎言和基准”,但是差异似乎很大。谁能告诉我我做错了什么。或者如果没有,怎么可能?我是 JS 新手,所以请不要打败我。
http://jsperf.com/factoryvsconstvsobjectcreate/3
/Edit 感谢 Andrew Fedoniouk 的小错误修复
我做了一个简单的对象创建基准。我知道“有谎言,该死的谎言和基准”,但是差异似乎很大。谁能告诉我我做错了什么。或者如果没有,怎么可能?我是 JS 新手,所以请不要打败我。
http://jsperf.com/factoryvsconstvsobjectcreate/3
/Edit 感谢 Andrew Fedoniouk 的小错误修复
Factory 和 Constructor 测试之间的巨大差异是由于后者执行了一系列额外的步骤。
当一个函数作为构造函数被调用时,它的 [[Construct]] 内部方法被调用,这很可能是导致性能差异的原因。查看 [[Construct]] 中涉及的所有步骤:
1. 设 obj 为新创建的原生 ECMAScript 对象。
2、按照8.12的规定设置obj的所有内部方法。
3. 将obj的[[Class]]内部属性设置为“Object”。
4.将obj的[[Extensible]]内部属性设置为true。
5. 令 proto 为使用参数“prototype”调用 F 的 [[Get]] 内部属性的值。
6.如果Type(proto)为Object,则将obj的[[Prototype]]内部属性设置为proto。
7. 如果 Type(proto) 不是 Object,将 obj 的 [[Prototype]] 内部属性设置为标准的内置 Object 原型对象,如 15.2.4 所述。
8. 令 result 为调用 F 的 [[Call]] 内部属性的结果,提供 obj 作为 this 值,并提供传入 [[Construct]] 的参数列表作为 args。
9. 如果 Type(result) 是 Object 则返回结果。
10. 返回对象。