小夏小夏,可爱到爆炸
如果我们想要对一个属性进行比较精准的操作控制,比如:这个属性是否允许属性被赋值?是否可以被删除?事发后可以被遍历出来?那么我们就可以使用 属性描述符。
Object.defineProperty
来对属性进行添加或者修改;Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此
对象。
Object.defineProperty(obj,props,descriptor)
接收值:
返回值:
被传递给函数的对象
分类
也就是说: value writable 不能和 get set 同存
特性
[[Configurable]]:
表示属性是否可以通过delete删除属性,是否可以修改它的特性,或者是否可以将它修改为存取属性描述符;
[[Enumerable]]:
表示属性是否可以通过for-in或者Object.keys()返回该属性;
[[Writable]]:
表示是否可以修改属性的值;
[[value]]:
属性的value值,读取属性时会返回该值,修改属性时,会对其进行修改;
作用
特性
[[Configurable]]:
表示属性是否可以通过delete删除属性,是否可以修改它的特性,或者是否可以将它修改为存取属性[[Enumerable]]:
表示属性是否可以通过for-in或者Object.keys()返回该属性;
[[get]]:
获取属性时会执行的函数。默认为undefined[[set]]:
设置属性时会执行的函数。默认为undefined利用了存取属性描述符,data 是个函数,返回一个对象,利用object.key 获取到 data 里所有的 key ,对每个key 利用 defineproperty 的存取属性描述符截获它的get 和 set, 如果某个地方data 里的数据对依赖发生改变,就从依赖里取或者执行
Object.keys(obj).forEach((key)=>{
Object.defineProperty(obj,key,{
get:
set:
}),
})
getOwnPropertyDescriptor 和 getOwnPropertyDescriptors 获取属性描述符
// 获取某个特性属性的属性描述符
console.log(Object.getOwnPropertyDescriptor(obj,'name'))
// 获取对象所有属性描述符 (多了一个 s)
console.log(Object.getOwnPropertyDescriptors(obj))
getOwnPropertyDescriptors 禁止对象继续添加新的属性
(在严格模式下会报错)
Object.getOwnPropertyDescriptors(obj)