gpt4 book ai didi

javascript - JS DefineProperty setter 未触发

转载 作者:行者123 更新时间:2023-11-28 03:56:57 28 4
gpt4 key购买 nike

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

问题2:如何获取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);

最佳答案

为了更简单,这段代码

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 的值!这正是您的代码中发生的情况。您获得子树并将state设置为13。要调用 setter,您需要执行以下操作

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

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

关于javascript - JS DefineProperty setter 未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47486266/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com