为什么通过点表示法的javascript对象属性赋值不会触发为该属性定义的setter?

时间:2011-01-27 09:04:46

标签: javascript

任何Javascript忍者或已阅读ECMA-262第5号护理的人解释以下行为?

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

我发现上述行为有点令人困惑,因为我预计这两个赋值符号在功能上是等价的。

1 个答案:

答案 0 :(得分:5)

根本区别在于obj.prop = foo正在改变prop引用的obj属性,而obj.prop.bar = "Bar"只是改变obj.prop对象的某些属性引用但不改变引用本身。