gpt4 book ai didi

javascript - JS 为类的每个属性定义 getter

转载 作者:行者123 更新时间:2023-12-02 18:36:03 24 4
gpt4 key购买 nike

我目前正在尝试编写一个类,为对象的所有属性定义通用的 getter 和 setter。我现在拥有的最接近的函数是名为 get 的函数和set对于整个类,它接受属性名称并返回它(如果存在)。

我尝试使用计算属性名称选项来动态定义 getter,但是在提供 getter 参数时出现错误,或者关于 prop 的错误未定义。有什么方法可以定义一对同时适用于 obj.prop 的对吗?和obj['prop']这不需要为类中的每个属性编写它们?

当前引用代码:

class Holder {
constructor(def="the door"){
this.holds=def
}
// Generic getter for every possible property
get (prop) {
if(prop in this){
return this[prop];
} else {
return `No property found named '${prop}'`;
}
}
// Generic setter, performs magic that sets `changed` as well.
set (prop, value) {
if(prop in this){
this[prop] = value;
this.changed = true;
}
}
}

const hodor = new Holder();
console.log(hodor.holds); // Expected: "the door"
console.log(hodor.derp); // Expected: "No property found named 'derp'"

最佳答案

因此,如果您运行上面的代码,您会发现它实际上不起作用。 console.log(hodor.holds) 将直接转到底层 this.holds 实例属性。

在 StackOverflow 上快速搜索后我找到了这个 Is it possible to implement dynamic getters/setters in JavaScript? 。我已修改您的代码以使用此代理方法,现在可以正常工作:

class Holder {
constructor(def = 'the door') {
this.holds = def;

return new Proxy(this, {
get(target, name, receiver) {
if (name in target) {
return target[name];
} else {
return `No property found named '${name}'`;
}
},
set(target, name, receiver) {
if (name in target) {
target[name] = receiver;
target.changed = true;
}
},
});
}
}

const hodor = new Holder();
console.log(hodor.holds); // Logs: the door
console.log(hodor.derp); // Logs: "No property found named 'derp'"
hodor.holds = 'bar';
console.log(hodor.holds); // Logs "bar"

关于javascript - JS 为类的每个属性定义 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68769030/

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