2011-01-27 5 views
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が参照するオブジェクトの一部のプロパティを変更することなく、基準自体を変化させていない状態

答えて

5

根本的な違いは、obj.prop = fooobj参照の何propプロパティを変更することです。

+0

私の答えでエラーを指摘してくれてありがとう。とても有難い。あなたはもちろん、かなり正しいです。 :-) –

+0

あなたの答えは、2つの割り当て表記が機能的に同等ではないことを明確にしています。 'obj.prop.bar =" Bar ** "と仮定します**' obj.prop'は初期化されたオブジェクトで、 'bar'プロパティを代入しようとしますが、' obj.prop = {foo : "Foo"} '**は' foo'というプロパティを持つ初期化されたオブジェクトとして** 'obj.prop'を定義します。 – braam

+0

実際にはありません。 1つの割り当て表記が有効です。 'obj.prop.bar =" Bar "は、最初に' obj.prop'が参照するオブジェクトを取得し(getterを定義している場合はgetterを使用して)、そのオブジェクトの 'bar'プロパティを設定しますsetterが呼び出される 'bar'プロパティ用のセッターを持っていました)。 'obj.prop = {foo:" Foo "}'は全く同じことをしていますが、 'obj'は解決を必要としない変数参照です。 –

関連する問題