【问题标题】:Object.assign getters and setters in constructorObject.assign 构造函数中的 getter 和 setter
【发布时间】:2017-03-05 20:03:25
【问题描述】:

我尝试通过Object.assign在构造函数中定义getter和setter:

function Class() {
  Object.assign(this, {
    get prop() { console.log('call get') },
    set prop(v) { console.log('call set') },
  });
}

var c = new Class(); // (1) => 'call get'
console.log(c.prop); // (2) => undefined
c.prop = 'change';
console.log(c.prop); // (3) => 'change' 

问题:

(1) 为什么要调用getter?

(2) 为什么不调用 getter?

(3) 为什么忽略setter?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您所有三个问题的答案都是相同的:Object.assign 从源对象读取属性的,它不会复制 getter/setter。

    如果你看一下属性描述符,你可以看到:

    var source = {
      get prop() { },
      set prop(v) { }
    };
    console.log("descriptor on source", Object.getOwnPropertyDescriptor(source, "prop"));
    var target = Object.assign({}, source);
    console.log("descriptor on target", Object.getOwnPropertyDescriptor(target, "prop"));

    要在 Class 内的 this 上定义该属性,请使用 defineProperty

    function Class() {
      Object.defineProperty(this, "prop", {
        get() { console.log('call get') },
        set(v) { console.log('call set') },
      });
    }
    var c = new Class();
    console.log(c.prop); // => 'call get', undefined
    c.prop = 'change'; // => 'call set'
    console.log(c.prop); // => 'call get', undefined

    【讨论】:

    • 反转它们有效? return Object.assign({ get prop() { console.log('call get') }, set prop(v) { console.log('call set') }}, this); }
    • @wmik - 不是真的:如果你这样做,结果对象将不是类的实例,它将是你作为第一个参数传递给 @987654328 的原始对象@.
    猜你喜欢
    • 2013-07-30
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    相关资源
    最近更新 更多