我尝试通过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'
问题:
(1)为什么要叫getter?
(2)为什么没有得到吸气剂?
(3)为什么忽略了setter?
答案 0 :(得分:9)
所有三个问题的答案都是相同的: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"));
要在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