2016-08-02 3 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')foobar,Objectを定義していないためfalseを返します。

+0

があります。私たちは 'foo.bar'を書いています.fooにbarという名前のプロパティを作成しません。プロパティを作成するには、このように書く必要があります。 'foo ['bar']' – ankyAS

+0

@ankyASいいえ、プロパティはすでに存在していますが、Fooはプロパティを所有していません。 FooはObjectから継承するので、Objectを宣言するすべてのプロパティを取得できます(barも含む)。 – Tibrogargan

0

これは、単純なグーがfooの直接の財産ですが、プロトタイプチェーンを通過するために必要なバーを取得します。 hasOwnPropertyは直接プロパティをチェックするだけです。

関連する問題