为什么通过点符号分配javascript对象属性不会触发为该属性定义的setter?
有没有Javascript忍者或读过ECMA-262的人愿意解释以下行为为什么通过点符号分配javascript对象属性不会触发为该属性定义的setter?,javascript,Javascript,有没有Javascript忍者或读过ECMA-262的人愿意解释以下行为 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" }
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
我发现上面的行为有点混乱,因为我希望这两个赋值符号在功能上是等效的。基本区别在于
obj.prop=foo
正在改变obj
的prop
属性引用的内容,而obj.prop.bar=“bar”
只是更改对象的某些属性,而不是更改引用本身。感谢您指出我答案中的错误。非常感谢。当然,你说得很对。:-)您的回答澄清了这两个赋值符号在功能上并不等同。如果我理解正确,obj.prop.bar=“bar”
假设obj.prop
是一个初始化对象,并尝试将属性bar
分配给它,而obj.prop={foo:“foo”}
将obj.prop
定义为具有属性foo
的初始化对象。游戏中只有一个赋值符号。obj.prop.bar=“bar”
首先获取obj.prop
引用的对象(如果定义了getter,则使用getter),然后设置该对象的bar
属性(如果该对象具有bar
属性的setter,则将调用该setter)obj.prop={foo:“foo”}
正在做完全相同的事情,只是obj
是一个不需要解析的变量引用。