1

我做了一个简单的对象创建基准。我知道“有谎言,该死的谎言和基准”,但是差异似乎很大。 任何人都可以告诉我,如果我做错了什么。或者,如果没有,那怎么可能? 我是JS新手,所以请不要打我。真的很奇怪的对象创建JS基准

http://jsperf.com/factoryvsconstvsobjectcreate/3

/编辑感谢安德鲁Fedoniouk一小bug修正

+0

我相信你的测试用例不正确 - 不清楚你在那里测量什么。以下是测量创建对象速度的测试:http://jsperf.com/factoryvsconstvsobjectcreate/4 –

+0

@ c-smile您的测试有一个错误。它在工厂每次都将返回的值赋给obj。 毕竟。我想测量整个模式,而不仅仅是对象的创建。 –

+1

是的,然后检查此http://jsperf.com/factoryvsconstvsobjectcreate/5。我会说,构造函数的字面创建和创建之间的区别是微不足道的。作为整个模式测试,我认为它不实用。通常班级/工厂申报只发生一次 - 在启动时。 –

回答

0

工厂和构造测试之间的巨大差异是由于一系列的后期进行额外的步骤。

当一个函数被调用作为构造函数时,its [[Construct]] internal method is invoked,这可能是性能差异的原因。查看[[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.让结果成为调用F的[[Call]]内部属性的结果,提供obj作为此值并将传递给[[Construct]]的参数列表作为参数提供。

9.如果Type(result)是Object,则返回结果。

10. Return obj。

+0

为了保持完整性,还应该列出工厂案例涉及的步骤。你会感到惊讶,但这些步骤在两种情况下几乎都是相同的。 –

+0

@ c-smile我的观点是,工厂方法只调用[[call]],而构造函数方法调用[[construct]],然后在步骤8中调用[[call]]。所以会有开销。 – bfavaretto

+0

因为在每个测试中只需要设置几行代码,我会感兴趣的只是'new Constructor()','factory()'和'Object.create(...)'的结果。你真正感兴趣的是事物的对象生成部分。 –