为什么通过点符号分配javascript对象属性不会触发为该属性定义的setter?

为什么通过点符号分配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" }

有没有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"
}

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
是一个不需要解析的变量引用。