2011-10-22 93 views
0

我已经tried更好地理解为什么要从Object(var o = Object.create(null);)继承一个(或不应该)。如果我的答案是正确的,性能的原因似乎是从null继承的主要可行理由。从空对象的“Interiting”似乎没有影响性能

所以,我想检查(利用体积小,方便和可爱探查称为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继承时没有性能损失?

回答

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> 

这样,我有更好的10%的结果当访问o1属性。

+1

当然你有。因为属性查找不是免费的。然而现代JIT编译器可以将成本降低到接近零,因此它是一种微型优化。 – Raynos

+0

比从零继承没有理由,呵呵。一些冗余的语言功能。并且故事的结尾,我猜:) – BreakPhreak

+1

正确的是_little_点,但是你可以想象人们抱怨说Object.prototype在他们的原型链中是_always_。 – Raynos

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方法,而不是你自己的)。

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

+0

刚刚重新考虑了主要代码片段并列在我自己的答案上方。我的逻辑是否一致,重点是(偏执性的)“证明”吗? – BreakPhreak

相关问题