2016-08-02 117 views
5

我試圖學習如何在JavaScript中的object.prototype函數,然後我遇到了這段代碼。我不明白?JavaScript對象原型中毒

// Poisoning Object.prototype 
Object.prototype.bar = 1; 
var foo = {goo: undefined}; 

foo.bar; // 1 
'bar' in foo; // true 

foo.hasOwnProperty('bar'); // false 
foo.hasOwnProperty('goo'); // true 

FOO具有在行號3中定義和屬性欄具有未定義的。請導的值,那麼爲什麼foo.hasOwnProperty('bar')返回false在這種情況下

+1

最好閱讀MDN [關於hasOwnProperty的文檔](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty) –

+1

它沒有*它*它,它*繼承*它。這就是原型的全部意義。 – Bergi

回答

4

JavaScript中的所有對象都是從Object開始的。所有對象都從Object.prototype繼承方法和屬性。

在您的例子,當你嘗試獲得foo.bar,它沒有找到在foobar,所以它要在foo的原型,並試圖找到它。

hasOwnProperty - 只檢查屬於您的foo的屬性。

這是你的foo樣子

enter image description here

對於深刻理解,你可以閱讀這一章。

You Don't Know JS

0

foo的對象具有屬性bar,因爲它從Object繼承它,因爲bar被添加到Object原型。 foo.hasOwnProperty('bar')返回false,因爲foo未定義bar,Object

+0

但那裏;我們寫了'foo.bar',而不是在foo中創建一個名爲bar的屬性。要創建財產,必須像這樣寫'foo ['bar']' – ankyAS

+0

@ankyAS不,財產已經存在,但Foo不擁有財產。 Foo從Object繼承,因此它獲得Object聲明的所有屬性,包括bar。 – Tibrogargan

0

很簡單咕是foo的直接財產,但是要得到禁止,要求遍歷原型鏈。 hasOwnProperty僅檢查其直接屬性。