Object.defineProperty()
方法會直接在一個對象上定義一個新屬性衡查,或者修改一個對象的現(xiàn)有屬性,并返回此對象必盖。
語法:
Object.defineProperty(obj, prop, descriptor)
obj
:要定義屬性的對象
prop
:要定義或修改的屬性的名稱或 Symbol
descriptor
:要定義或修改的屬性描述符
數(shù)據(jù)描述符:
let obj = {}
Object.defineProperty(obj, 'name', {
value: 1,
})
console.log(obj.name)//1
obj.name = 'zqf'
console.log(obj.name)//1
let obj = {}
Object.defineProperty(obj, 'name', {
value: 1,
writable: true
})
console.log(obj.name)//1
obj.name = 'zqf'
console.log(obj.name)//zqf
存取描述符:
let obj = {
initValue: '1',
}
Object.defineProperty(obj, 'name', {
get(){
return obj.initValue
},
set(value) {
obj.initValue = value
}
})
console.log(obj.name)
obj.name = 'zqf'
console.log(obj.name)
使用存取描述符遇到的問題:
當Object.defineProperty設置的prop和obj原有的prop相同時會造成死循環(huán)拌牲,如下面的initValue屬性
let obj = {
initValue: '1',
}
Object.defineProperty(obj, 'initValue', {
get(){
return obj.initValue
},
set(value) {
obj.initValue = value
}
})
console.log(obj.initValue)
obj.initValue = 'zqf'
console.log(obj.initValue)
原因:
console.log(obj.initValue)
觸發(fā)get方法,return obj.initValue
再次觸發(fā)get方法
obj.initValue = 'zqf'
觸發(fā)set方法歌粥,obj.initValue = value
再次觸發(fā)set方法
詳細的說明請看MDN文檔