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

标签 javascript node.js

我目前正在尝试编写一个类,为对象的所有属性定义通用的 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/

相关文章:

javascript - 使用 jQuery 根据 Google Geocoding API JSON 响应的类型获取值

node.js - Arangodb - 使用 EDGE 获取断言错误 edge._key 相等

javascript - Node.js Express - 在代理请求后调用 next()

node.js - 使用 Amazon S3 的请求 promise 上传文件缓冲区

node.js - package-lock.json 会阻止更新吗?

javascript - Nodemailer:ERR_CONNECTION_RESET 与 AngularJS 和 NodeJS 与 POST

javascript - jquery,ajax,将发布结果加载到div

javascript - 根据选择选项显示/隐藏 div 不起作用

javascript - javascript onClick 不工作

javascript - 检查事件处理程序参数