2012-04-12 19 views
0

下面的代碼是從http://bonsaiden.github.com/JavaScript-Garden/的Javascript原型的傳承

function Foo() { 
    this.value = 42; 
} 
Foo.prototype = { 
    method: function() {} 
}; 

function Bar() {} 

// Set Bar's prototype to a new instance of Foo 
Bar.prototype = new Foo(); 
Bar.prototype.foo = 'Hello World'; 

// Make sure to list Bar as the actual constructor 
Bar.prototype.constructor = Bar; 

我也碰到過這樣的解釋採取多次 「當訪問一個對象的屬性,首先它會檢查對象自身具有財產和如果不是,它會轉到該對象的原型以查找該屬性等。「

但我努力理解浩其實這工作,因爲下面的代碼

var test1 = new Bar(); 
var test2 = new Bar(); 

test1.value = 24; 

現在值不是test1的對象的一部分的行爲,但它是其原型的屬性,它是一個Foo對象,並且由於原型是Foo對象,Bar的所有實例都將共享值屬性,我期望上面的代碼所做的是將該值屬性設置爲24,但相反,它會爲test1創建一個名爲'value'的新屬性對象並將其賦值24,將原型中的value屬性保留爲其初始值42.這聽起來不像共享。 test2.value仍然有一個值42.當我看着螢火蟲控制檯中的原型鏈時,它顯示test1具有值爲24的屬性,並且其原型具有值爲42的屬性。

這很混亂至。有沒有人找出它爲什麼這樣表現?

回答

2

閱讀性質且僅當在對象本身是沒有找到該屬性的原型鏈只使用 - 當屬性值,不作爲。

只要你屬性爲對象(test1.value = 24)在原型具有相同名稱的任何現有的「共享」的屬性是隱藏的,以及所有後續讀取將訪問值現在的對象本身存儲。

1

我想你想.hasOwnProperty()

如果這是你在找什麼,別人已經雄辯地把它概括這裏 hasOwnProperty in javascript

編輯

看了其他回答,然後正確地閱讀這次的問題...我想撤回這一點;-)

...

或者它可能是你正在尋找的東西,你想在做別的事情之前檢查該屬性是否已經設置在'哈希'上。

我讀過這太多次和困惑我想,我會閉嘴現在

1

只需追加下列在最後,檢查發生了什麼事情。

var test1 = new Bar(); 
test1.value = 30; 

console.log(test1.hasOwnProperty("value")); 
console.log(test1.value); 

delete test1.value; 

console.log(test1.hasOwnProperty("value")); 
console.log(test1.value); 

輸出:

true 
30 
false 
42 

條款:

  • hasOwnProperty只返回true是關鍵的是對象的本地屬性。
  • 刪除用於刪除本地地產不接觸繼承屬性。

Explanantion 如果我們分配一個值,那麼它會創建它自己的本地屬性和覆蓋原型屬性。因而,作爲地方性質比原型性能更高的優先級,它們首先被讀取。