2012-04-12 23 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のあるそのプロトタイプのプロパティですObject、プロトタイプはFoo Objectなので、Barのすべてのインスタンスはvalueプロパティを共有します。上記のコードでは、値のプロパティを24に設定することが期待されますが、代わりにtest1に 'value'という名前の新しいプロパティが作成されますそれを初期値42にプロトタイプのvalueプロパティを残して割り当てます。これは共有のようには聞こえません。 test2の値はまだ42です。Firebugコンソールのプロトタイプチェーンを見ると、test1の値プロパティは24、プロトタイプの値プロパティは42です。

これは非常に混乱していますに。このように動作する理由を理解した人はいますか? プロパティを読み込むとき

答えて

2

プロトタイプチェーンにのみ使用され、プロパティは、オブジェクト自体に見つからない場合にのみ - プロパティ値を書き込む際には使用されていません。すぐに同じ名前のプロトタイプでは、既存の「共有」プロパティが隠されており、その後の読み取りすべてがオブジェクト自体に格納今値にアクセスするオブジェクト(test1.value = 24)にプロパティを記述として

1

が、私はそれはあなたが探しているものである場合は、.hasOwnProperty()

をしたいと考え、他の誰かが雄弁に hasOwnProperty in javascript

EDIT

は、他のを読んだそれをここにまとめています答え、今度は質問を正しく読んでください。私はそれを撤回したいです;-)

...

それはあなたが探しているもので、何か他のことを行う前にプロパティが 'ハッシュ'に設定されているかどうかをチェックしたいと思うかもしれません。

私はこの何回も読んで、私は、私が今

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 我々は、値を割り当てた場合、それは独自のローカルプロパティの作成や原型プロパティをオーバーライドします。したがって、ローカルプロパティはプロトタイププロパティよりも優先度が高いため、最初に読み込まれます。

関連する問題