最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Object.assign getters and setters in constructor - Stack Overflow

programmeradmin4浏览0评论

I try to define getter and setter in constructor via Object.assign:

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' 

Questions:

(1) Why getter is called?

(2) Why getter isn't called?

(3) Why setter is ignored?

I try to define getter and setter in constructor via Object.assign:

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' 

Questions:

(1) Why getter is called?

(2) Why getter isn't called?

(3) Why setter is ignored?

Share Improve this question edited Oct 24, 2016 at 6:23 mqklin asked Oct 24, 2016 at 6:12 mqklinmqklin 2,0485 gold badges22 silver badges39 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 25

The answer to all three of your questions is the same: Object.assign reads the value of the property from the source object, it doesn't copy getters/setters.

You can see that if you look at the property descriptor:

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"));

To define that property on this inside Class, use 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

发布评论

评论列表(0)

  1. 暂无评论