Object.defineProperty
Object.defineProperty(obj,prop,descriptor)
定义对象中新属性或修改原有的属性
- obj:必需。目标对象
- prop:必需。需定义或修改的属性的名字
descriptor:必需。目标属性所拥有的特权 — 以 对象形式 {} 书写
- value:设置属性的值 默认为
undefined
- writable:值是否可以重写。 true | false 默认为false
- enumerable:目标属性是否可以被枚举,默认为false
- configurable:目标属性是否可以被删除或是否可以再次修改特性,默认为false
- value:设置属性的值 默认为
基本使用:
// Object.defineProperty() 定义新属性或修改原有属性
const obj = {
id: 1,
pname: '小米',
price: 199
};
Object.defineProperty(obj,'num',{
value: 1000
/*虽然没有加 enumerable 但是默认是 false 所以也没法遍历出来*/
})
Object.defineProperty(obj,'price', {
value: 9.9
})
console.log(obj)
Object.defineProperty(obj,'id', {
writable: false
})
obj.id = 2
console.log(obj)
Object.defineProperty(obj, 'address', {
value: '中国山东蓝翔',
// 如果只为 false 不允许修改这个属性值,默认值也是 false
writable: false,
// 如果值为 false 则不允许遍历,默认值是 false
enumerable: false,
// 如果为 false 则不允许删除这个属性 默认为 false
configurable: false
})
console.log(obj) //{id: 1, pname: "小米", price: 9.9, num: 1000, address: "中国山东蓝翔"}
console.log(Object.keys(obj)) // (3) ["id", "pname", "price"]
delete obj.address
delete obj.pname
console.log(obj) //{id: 1, price: 9.9, num: 1000, address: "中国山东蓝翔"}
Object.defineProperty(obj, 'address', {
value: '中国山东蓝翔',
// 如果只为 false 不允许修改这个属性值,默认值也是 false
writable: true,
// 如果值为 false 则不允许遍历,默认值是 false
enumerable: true,
// 如果为 false 则不允许删除这个属性 默认为 false 不允许再次修改参数里面的特性 默认为 false
configurable: true
})
console.log(obj.address) // 报错 Cannot redefine property: address at Function.defineProperty