Q1:有人能解释如何在defineProperty中触发setter,通过这种方式通过函数使用它吗?
Q2:如何在setter中获取最后一个键?
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);
答案 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
This和this(由您链接)介绍了范围和捕获工作的方式,因此您应该掌握一些涵盖所有这些内容的书(或浏览SO,有(可能)关于那个问题很多。)