JS defineProperty setter没有触发

时间:2017-11-25 13:02:38

标签: javascript defineproperty

Q1:有人能解释如何在defineProperty中触发setter,通过这种方式通过函数使用它吗?

Q2:如何在setter中获取最后一个键?

fiddle is here

function test(root) {

  Object.defineProperty(this, 'subtree', {
    get: function() {
      console.log("get");
      return root.subtree;
    },
    set: function(value) { //doesn't triggered
      console.log("set");
      root.subtree = value;
    }
  });

}

var demo = new test({
    subtree: {
        state: null,
        test: 1
    }
});

console.log("START", demo.subtree);

demo.subtree.state = 13; // doesn't triggered setter, but change object

console.log("END", demo.subtree);

1 个答案:

答案 0 :(得分:0)

为了简化,这段代码

let variable = null;
let obj = {
    set variable(value) {
        variable = value;
    }
    get variable() {
        return variable;
    }
};

obj.variable = {a: 5};
console.log(obj.variable);

和这个完全一样

let variable = null;
let obj = {
    setVariable(value) {
        variable = value;
    }
    getVariable() {
        return variable;
    }
};

obj.setVariable({a: 5}); // equivalent to obj.variable = {a: 5}
console.log(obj.getVariable()); // equivalent to obj.variable

但后者清楚地显示了正在发生的事情。

我们希望访问a并将其设置为某个值

console.log(obj.getVariable().a); // get a
obj.getVariable().a = 6; // set a!

请注意,我们不会调用setVariable来设置a的值!这正是您的代码中发生的事情。您获得subtree并将state设置为13。要调用setter,请执行以下操作

obj.setVariable({a: 6});
obj.variable = {a: 6}; // getter/setter example
demo.subtree = {state: 13}; // your code

Thisthis(由您链接)介绍了范围和捕获工作的方式,因此您应该掌握一些涵盖所有这些内容的书(或浏览SO,有(可能)关于那个问题很多。)