4
Javascriptの忍者やECMA-262を読んだ人は、次のような行動を説明するために5番目の気にしていますか?ドット表記によるjavascriptオブジェクトのプロパティ割り当てが、そのプロパティに対して定義されたセッターをトリガーしないのはなぜですか?
var obj = {
p: {},
set prop(val){
for (var key in val){
this.p[key] = "Set: " + val[key];
}
},
get prop(){
return this.p;
}
}
obj.prop = { // Assignment triggers setter
foo: "Foo"
}
obj.prop.bar = "Bar"; // Assignment does not trigger setter
console.log(obj.prop.foo); // Set: Foo
console.log(obj.prop.bar); // Bar
2つの割り当て表記が機能的に同等であると予想していたため、上記の動作が少し混乱していました。 obj.prop.bar = "Bar"
は単にobj.prop
が参照するオブジェクトの一部のプロパティを変更することなく、基準自体を変化させていない状態
私の答えでエラーを指摘してくれてありがとう。とても有難い。あなたはもちろん、かなり正しいです。 :-) –
あなたの答えは、2つの割り当て表記が機能的に同等ではないことを明確にしています。 'obj.prop.bar =" Bar ** "と仮定します**' obj.prop'は初期化されたオブジェクトで、 'bar'プロパティを代入しようとしますが、' obj.prop = {foo : "Foo"} '**は' foo'というプロパティを持つ初期化されたオブジェクトとして** 'obj.prop'を定義します。 – braam
実際にはありません。 1つの割り当て表記が有効です。 'obj.prop.bar =" Bar "は、最初に' obj.prop'が参照するオブジェクトを取得し(getterを定義している場合はgetterを使用して)、そのオブジェクトの 'bar'プロパティを設定しますsetterが呼び出される 'bar'プロパティ用のセッターを持っていました)。 'obj.prop = {foo:" Foo "}'は全く同じことをしていますが、 'obj'は解決を必要としない変数参照です。 –