Object.assign构造函数中的getter和setter

mqk*_*lin 9 javascript

我尝试通过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' 
Run Code Online (Sandbox Code Playgroud)

问题:

(1)为什么叫getter?

(2)为什么没有叫getter?

(3)为什么setter被忽略了?

T.J*_*der 11

所有三个问题的答案都是一样的:从源对象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"));
Run Code Online (Sandbox Code Playgroud)

要在this内部定义该属性Class,请使用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
Run Code Online (Sandbox Code Playgroud)