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 = 2console.log(obj)Object.defineProperty(obj, 'address', {value: '中国山东蓝翔',// 如果只为 false 不允许修改这个属性值,默认值也是 falsewritable: false,// 如果值为 false 则不允许遍历,默认值是 falseenumerable: false,// 如果为 false 则不允许删除这个属性 默认为 falseconfigurable: false})console.log(obj) //{id: 1, pname: "小米", price: 9.9, num: 1000, address: "中国山东蓝翔"}console.log(Object.keys(obj)) // (3) ["id", "pname", "price"]delete obj.addressdelete obj.pnameconsole.log(obj) //{id: 1, price: 9.9, num: 1000, address: "中国山东蓝翔"}Object.defineProperty(obj, 'address', {value: '中国山东蓝翔',// 如果只为 false 不允许修改这个属性值,默认值也是 falsewritable: true,// 如果值为 false 则不允许遍历,默认值是 falseenumerable: true,// 如果为 false 则不允许删除这个属性 默认为 false 不允许再次修改参数里面的特性 默认为 falseconfigurable: true})console.log(obj.address) // 报错 Cannot redefine property: address at Function.defineProperty
