2011-10-22 88 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

相關問題