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

Posted

技术标签:

【中文标题】来自空对象的“Interiting”似乎不会影响性能【英文标题】:"Interiting" from null object does not seem to affect performance 【发布时间】:2011-10-22 09:40:26 【问题描述】:

我已经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 继承时没有性能损失?

【问题讨论】:

【参考方案1】:

是的,没有性能损失。

为什么会有?它没有检查[[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 方法而不是您自己的方法) .

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

【讨论】:

刚刚重新考虑了主要代码 sn-p 并在我自己的答案上方列出。我的逻辑是否一致,重点是(偏执地:)“证明”,好吗?【参考方案2】:

我重新考虑了自己的代码并稍微修改了代码以使 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%。

【讨论】:

当然可以。因为属性查找不是免费的。然而,现代 JIT 编译器可以将成本降低到接近于零,因此它是一个微优化。 没有理由从null“继承”,呵呵。一些冗余的语言特性。故事的结尾,我猜 :) 正确有一点点,但是你可以想象人们抱怨Object.prototype在他们的原型链中总是

以上是关于来自空对象的“Interiting”似乎不会影响性能的主要内容,如果未能解决你的问题,请参考以下文章

Python Flask 故意空响应

更改组件可见性时 Android Studio 空对象引用错误

继承(来自视频)

在TypeScript中如何防止属性被添加到一个空对象中?

为啥 JSON.stringify 为似乎具有属性的对象返回空对象表示法“”?

Require_once 似乎不会影响所有功能?