来自null对象的“Interiting”似乎不会影响性能

时间:2011-10-22 09:40:27

标签: javascript profiling

tried更好地理解为什么一个(或不应该)从Object(var o = Object.create(null);)继承。如果我的答案是对的,性能原因似乎是从null“继承”的主要原因。

所以,我想检查一下(使用名为JSLitmus的小巧,方便且可爱的分析器):

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Title</title>

    <script src="JSLitmus.js"></script>
    <script>
    JSLitmus.test('Prototypeless test', function() {
        var o1 = Object.create(null);
        o1.foo = "bar";
        for (i = 0; i < 1000000; ++i) {
          o1.foo;
        };
    });

    JSLitmus.test('Prototypeful test', function() {
        var o2 = {};
        o2.foo = "bar";
        for (i = 0; i < 1000000; ++i) {
          o2.foo;
        };
    });

    </script>

</head>
<body>
</body>
</html>

执行时,我得到了相同的(有争议的)结果。这是否意味着从Object继承时没有性能损失?

2 个答案:

答案 0 :(得分:0)

是的,没有性能损失。

为什么会这样?它没有[[Prototype]]支票,因为fooo的自有属性。

您希望从null继承的原因是构建自己的原型链。它只是让你控制。

一般来说,你希望从Object.prototype继承,因为它上面的方法很有用,而且几乎所有的代码都“假定”每一个东西都是从它继承的。

但是,您可以使用特殊逻辑

创建自己的链
var newObject = Object.make(null,{
  toString: function  () { return "foobar"; },
  valueOf: function () { return 42;  }
});

对于Object.make

的某些值

然后只创建那个

的实例
var o = Object.create(newObject);
console.log(o + 3);
console.log("foo" + o);

Live Example

如果你真的想要对.valueOf和其他方法进行细粒度的自定义控制,那么为了调试目的而不是从Object.prototype继承是有意义的(即不要意外地使用Object.prototype方法你自己的。)

除此之外,我认为没有真正的用例。它可能稍微快一些,或占用的内存略少。

答案 1 :(得分:0)

我重新考虑了我自己的代码并略微修改了代码,使foo字段查找通过“继承”链传播:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Title</title>

    <script src="JSLitmus.js"></script>
    <script>
    var o1 = Object.create(null);
    o1.foo = "bar";

    var o2 = Object.create(o1);

    var count;

    JSLitmus.test('Prototypeless test', function() {
        while(--count) {
          o1.foo;
        };
    });

    JSLitmus.test('Prototypeful test', function() {
        while(--count) {
          o2.foo;
        };
    });

    </script>

</head>
<body>
</body>
</html>

通过这种方式,我在访问o1属性时获得了10%的更好结果。