2016-02-17 36 views
-2

我想了解hasOwnProperty()方法..我明白,方法測試對象是否有一個自己的屬性與方法中給定的名稱。但是,對於繼承的屬性,它將返回falsehasOwnProperty()方法

var o = { 
 
    name: 'Master', 
 
    number: '117', 
 
    last: 'Chief' 
 
}; 
 

 
o.prototype = { 
 
    planet: 'Halo' 
 
}; 
 

 
for(var p in o) { 
 
    if(!o.hasOwnProperty(p)) { 
 
    continue; 
 
    } 
 
    console.log(p); 
 
}

所以,當我運行此腳本,控制檯將返回 「名」, 「號碼」, 「最後」,並從o.prototype 「原型」。有人能給我一個解釋爲什麼腳本如果返回繼承屬性?我認爲否定方法「hasOwnProperty()」會跳過繼承的屬性。

+0

這並不打印「星球」,所以它正在做你期望的。 –

+1

不可複製。這段代碼記錄了名字,數字,最後一個原型,而不是名字,數字,最後一個工廠。並且該對象只從Object.prototype繼承,它沒有任何枚舉屬性(默認情況下)。 – Oriol

+1

[MDN](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty)有一篇文章很好地解釋了這種方法。你實際上掙扎的是關於原型繼承的概念,這是你在使用原型失敗時顯而易見的。請閱讀[使用對象](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects),花一些時間在JavaScript中正確學習OOP。 – Oka

回答

-1

你的代碼創建一個對象,並使用3「自己」的屬性將其提供:

var o = { 
    name: 'Master', 
    number: '117', 
    last: 'Chief' 
}; 

然後,您只需創建一個4:

o.prototype = { 
    planet: 'Halo' 
}; 

當一個屬性的對象上檢索,首先檢查當前對象的「自己」屬性。如果沒有找到屬性,則檢查原型鏈 - 一直到Object.prototype。如果在原型鏈中找不到該屬性,則返回undefined。

但是,當屬性被設置時,會發生不同的行爲。無論屬性是否被繼承,都會在當前對象上創建一個新屬性作爲「自己」屬性(如果相關屬性是訪問器屬性,則此規則的一個例外是)。

您正在設置的原型創建了您在控制檯中輸出的第4個和最終屬性。