2011-01-27 76 views
4

任何Javascript忍者或讀過ECMA-262 5th的人都會解釋以下行爲嗎?爲什麼通過點符號的javascript對象屬性賦值不會觸發爲該屬性定義的setter?

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 

我發現上述行爲有點令人困惑,因爲我期望兩個賦值符號在功能上是等價的。

回答

5

的根本區別在於obj.prop = foo正在改變的obj引用prop財產,而obj.prop.bar = "Bar"只是改變到obj.prop是指對象的某些屬性,但不改變引用本身。

+0

感謝您指出我答案中的錯誤。非常感激。你當然是非常正確的。 :-) – 2011-01-27 10:08:11

相關問題