这个方法可以给对象添加新的属性
这个方法接受3个参数
Object.defineProperty(1,2,3)
1:要给哪个对象添加属性
2:添加的属性名
3:配置项,里面可以有很多参数
配置项中有很多参数,常见的有如下:
1.value:添加的属性对应的值,默认为undefined
2.enumerable: 表示能否通过for in循环访问属性,默认值为false
3. writable: 表示能否修改属性的值。默认值为false。
4.configurable: 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认值为false。
例子
let person = {
name:'小张',
address:'北京'
}
Object.defineProperty(person,'age',{
value:18
})
console.log(person); //{name: '小张', address: '北京', age: 18}
这里需要注意:
1.不可遍历
通过这种方法添加的属性不会参与遍历,遍历对象属性的时候不会出现
这里进行遍历上面得到的person方法
console.log(Object.keys(person)); //['name', 'address']
//这里的Object.keys() 返回一个给定对象遍历后组成的数组,数组由对象属性名组成
如果想要参与遍历就得给配置项添加参数
Object.defineProperty(person,'age',{
value:18,
enumerable:true//可以让新添加的属性参与遍历
})
2.不可以被修改
Object.defineProperty(person,'age',{
value:18,
enumerable:true,
writable:true //可以让新添加的属性可以被修改
})
3.不可以被删除
Object.defineProperty(person,'age',{
value:18,
enumerable:true,
writable:true,
configurable:true //可以控制属性是否可以删除
})
上面的都是基本配置项,下面说一下高级配置项
let number = 18;
let person = {
name:'张三',
sex:'男',
}
Object.defineProperty(person,'age',{
//当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是 age的值
get:function() {
return number
},
//当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
set:function(value) {
console.log('有人修改了age值,且修改值为',value);
number = value;
}
}