defineProperty 的使用
defineProperty 是什么?
defineProperty 是 Object 原型方法,通过defineProperty方法 可以为对象新增属性。
通过defineProperty 方法新增属性和直接给对象新增属性的区别
-
defineProperty 方法可为属性设置数据属性(configurable **enumerable ** writable )
-
直接为对象添加属性 数据属性(configurable **enumerable ** writable )默认值都为 true
let person={} Object.defineProperty(person,"name",{ value:'zhangSan', }) // 默认不设置则全部都为false console.log(Object.getOwnPropertyDescriptor(person,'name')); /* *configurable: false *enumerable: false *value: "zhangSan" *writable: false * */
什么是数据属性?
configurable 若为 false
-
无法 使用 delete 删除 对象的属性值
-
可以将 writable 值 由 true 变为 false
````javascript
let person={}
Object.defineProperty(person,"name",{
value:'zhangSan',
configurable:false
})
delete person.name
/*
TypeError: Cannot delete property 'name' of #<Object>
*/
````
enumerable
enumerable 若为 false
- 无法使用 for in 遍历 对象属性
writable
writable 若为 false
- 无法修改属性值
let person={}
Object.defineProperty(person,"name",{
value:'zhangSan',
writable : false
})
/*
Uncaught TypeError: Cannot assign to read only property 'name' of object '#<Object>'
*/
访问器属性(Configurable、Enumerable、Get、Set)
- Configurable为false, 不能使用delete删除属性、不能修改数据属性
- Enumerable为false,不能使用for-in访问属性
- Get 函数 读取函数值调用
- Set 函数 写入函数值调用
读取属性的特性
-
Object.getOwnPropertyDescriptor -
返回对象 包含数据属性、访问器属性