0

以下のコードはhttp://bonsaiden.github.com/JavaScript-Garden/から取得したものです。

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;

現在、valueはtest1オブジェクトの一部ではありませんが、Fooオブジェクトであるプロトタイプのプロパティです。プロトタイプはFooオブジェクトであるため、Barのすべてのインスタンスがvalueプロパティを共有します。上記のコードで期待されることは、そのvalueプロパティを24に設定しますが、代わりに'value'という名前の新しいプロパティをtest1オブジェクトに作成し、24割り当てて、プロトタイプのvalueプロパティを初期値42のままにします。これは共有のようには聞こえません。test2.valueの値はまだ42です。firebugコンソールでプロトタイプチェーンを見ると、test1には24の値プロパティがあり、そのプロトタイプには42の値プロパティがあることがわかります。

これは非常に混乱します。なぜこのように動作するのか理解した人はいますか?

4

3 に答える 3

2

プロトタイプチェーンは、プロパティを読み取るときにのみ使用され、プロパティがオブジェクト自体に見つからない場合にのみ使用されます。プロパティ値を書き込むときには使用されません。

プロパティをオブジェクト( )に書き込むとすぐにtest1.value = 24、同じ名前のプロトタイプ内の既存の「共有」プロパティが非表示になり、以降のすべての読み取りで、オブジェクト自体に格納されている値にアクセスします。

于 2012-04-12T12:48:47.970 に答える
1

.hasOwnProperty()が必要だと思います

それがあなたが探しているものである場合、他の誰かがそれをここに雄弁に要約しています javascriptのhasOwnProperty

編集

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

..。

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

私はこれを何度も読んで混乱していると思います、私は今黙ります

于 2012-04-12T12:49:36.790 に答える
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のみを返します。keyはオブジェクトのローカルプロパティです。
  • deleteは、継承されたプロパティに影響を与えないローカルプロパティを削除するために使用されます。

説明 値を割り当てると、それ自体のローカルプロパティが作成され、プロトタイププロパティが上書きされます。したがって、ローカルプロパティはプロトタイププロパティよりも優先度が高いため、最初に読み取られます。

于 2016-04-08T03:44:34.303 に答える