【问题标题】:How to Apply a Getter/Setter to an Object如何将 Getter/Setter 应用于对象
【发布时间】:2017-08-09 21:59:31
【问题描述】:

在定义对象时如何将 getter/setter 应用到对象本身?

比如我想做

myobj = 123 运行console.log(123)

我知道使用class extends 是可能的,但我想找到一种更简单的方法来定义getter/setter,可能在构造函数中。

有人知道怎么做吗?这甚至可能吗?

如果您需要更多信息,或者我不够清楚,请告诉我。 - JacobTDC

【问题讨论】:

  • myobj = 123中没有对象
  • @MinusFour,这只是一个例子。

标签: javascript node.js constructor getter-setter


【解决方案1】:

getterssetters 与对象的属性相关,而不是变量分配,就像您的问题一样。

class extends 在这里并不真正相关。

检查这个例如[1]:

var language = {
  set current(name) {
    this.log.push(name);
  },
  log: []
}

language.current = 'EN';
console.log(language.log); // ['EN']

language.current = 'FA';
console.log(language.log); // ['EN', 'FA']

1 代码取自 MDN

【讨论】:

  • 是的,我意识到这是可能的,我只是不想那样做。
  • 恐怕变量赋值不是你可以在javascript中“获取”的东西(我什至不确定哪种语言支持这个)。
  • 感谢您的澄清。
【解决方案2】:

这实际上在 MDN Working with Objects, Defining getters and setters 中得到了很好的描述 - 本文提供了一个简单的例子来说明 JavaScript 中的 getter 和 setter 用法。

此示例的修改(以适应您的问题)版本如下所示:

var o = {
    set myvar(value) {
        console.log(value);
        this.myvar = value;
    }
};

o.myvar = 123;
// Should call console.log(123)

还有另一种方法可以做到这一点 - 您可以使用 ES2015 代理及其 get()set() 陷阱。这在您出于某种原因不想修改原始对象的情况下可能很有用。

这两个代理对每个对象都是“全局的”(如 - 它们捕获对代理对象的所有属性执行的获取/设置)。这是一个基于链接文章的简单示例:

var o = new Proxy({}, {
    set: function(target, prop, value, receiver) {
        target[prop] = value;

        // "set" proxy is global, so it will catch calling assignment operator on ALL properties of this object
        if (prop === "myvar") {
            console.log(value)
        }

        return true
    }
});

o.myvar = 123;
// Should call console.log(123)

【讨论】:

  • 您能否指出所描述的页面中的哪个位置,因为过去 30 分钟我一直在查看那个确切的页面,并且开始看起来都一样。
  • 我提供的第一个链接直接指向上述示例(在b 属性上定义了getter 的那个)。
  • 我已经用两个例子编辑了我的答案,也许这会有所帮助。
  • 谢谢,@mdziekon!
【解决方案3】:

您可以使用Object.defineProperty() 为属性定义一个setter:

var a = {}
Object.defineProperty(a, 'myobj', {
  set: function (value) {
    console.log(value)
  }
})
a.myobj = 111

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多