2016-10-24 48 views
2

我試着通過Object.assign來定義構造函數getter和setter: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被忽略?

回答

2

對您所有三個問題的回答都是一樣的:Object.assign從源對象中讀取屬性,它不復制getters/setters。

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

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