發現了一個關于Object.defineProperty很有趣的事情
對原型調用Object.defineProperty定義通路器屬性,屬性是定義在原型上,執行個體隻是會繼承該屬性,執行個體對象修改或通路該屬性時,調用的是設定在原型上的該屬性的set和get
是以如果這些方法使用變量存儲,則所有對象将共享該值
function myclass(){}
var value;
Object.defineProperty(myclass.prototype,'x',{
// get:function(){}的縮寫,es6新特性
get(){
return value;
},
set(x){
value = x;
}
})
var a = new myclass();
var b = new myclass();
a.x=1
console.log(b.x) //1
console.log(a.hasOwnProperty('x')) //false (注意這裡是false,表示執行個體中沒有x這個屬性)
如果是資料屬性,值始終在對象本身上設定,而不是原型上,
function myclass2(){}
Object.defineProperty(myclass2.prototype,'x',{
writable:true,
value:1
})
var a2 = new myclass2();
a2.x=2;
console.log(a2.x); //2
console.log(myclass.prototype.x); //1
console.log(a2.hasOwnProperty('x')) //true (這裡是true,表示執行個體中有x這個屬性)