const person = { name: 'Lydia' }
Object.defineProperty(person, 'age', {
value: 21,
})
console.log(person)
console.log(Object.keys(person))
輸出結果

原因:
defineProperty方法提供給我們(getter)給物件添加一個新屬性,或者通過(setter)修改已經存在的屬性,當然上面的例子只涉及到最簡單的修改,
const person = { name: 'Lydia' }
let number=21;
Object.defineProperty(person, 'age', {
// value:21,
enumerable:true, //控制屬性是否可以列舉,默認值是false
// writable:true, //控制屬性是否可以被修改,默認值是false
// configurable:true //控制屬性是否可以被洗掉,默認值是false
//當有人讀取person的age屬性時,get函式(getter)就會被呼叫,且回傳值就是age的值
get() {
console.log('有人讀取age屬性了')
return number
},
//當有人修改person的age屬性時,set函式(setter)就會被呼叫,且會收到修改的具體值
set(value) {
number = value
},
});
age屬性會自動幫我們轉為setter/getter,等我們真正需要或者修改,則會顯示出對應的age屬性

而在使用了該方法給物件添加一個屬性后,屬性便默認為 不可列舉 not enumerable,
因此Object.keys方法僅回傳物件中 可列舉 enumerable的屬性,即代碼中的name,
添加屬性改變Object.defineProperty方法的默認行為
之所以有以下的寫法,也是為我們相比于添加到物件中的屬性有更多控制權
Object.defineProperty(person, 'age', {
value:21,
// enumerable:true, //控制屬性是否可以列舉,默認值是false
// writable:true, //控制屬性是否可以被修改,默認值是false
// configurable:true //控制屬性是否可以被洗掉,默認值是false
})
資料代理
定義:
通過一個物件代理對另一個物件中屬性的讀或寫操作,而我們可以通過Object.defineProperty方法實作
//創建物件1
let obj = { x: 100 }
//創建物件2
let obj2 = { y: 200 }
//我希望可以令物件2代理物件1,并進行相應的操作
Object.defineProperty(obj2, 'x', {
get() {
return obj.x
},
set(value) {
obj.x = value
},
})
可以看到確實能實作(注意要在開發者模式的控制臺下操作)


轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/499900.html
標籤:JavaScript
上一篇:flv.js的追幀、斷流重連及實時更新的直播優化方案
下一篇:記錄--WebSocket 原理
