题外话:好久没更新了,媳妇生了孩子,白天上班晚上带娃,根本没有学习更新的时间,还真是少壮不努力 老大徒伤悲,年轻的朋友们,趁年轻真的得多学一点东西,特别现在这个就业环境,难绷。。。
我们都知道vue2的响应式原理就是通过Object.defineProperty实现的,我们就简单了解一下属性描述符这个东西。
属性描述符是什么?
我们可以通过Object.getOwnPropertyDescriptor得到某个属性的描述符是什么
var obj = {name: 1};
// 得到属性描述符
var desc = Object.getOwnPropertyDescriptor(obj, "name")
// desc如下
// {value: 1, writable: true, enumerable: true, configurable: true}
值 | 说明 |
---|---|
value | obj.name的值 |
writable | obj.name是否可以写(可以重新赋值),默认是true |
enumerable | obj的name属性是否可被枚举(for (key in obj)....),默认是true |
configurable | 可配置,下面举例说明,默认是true |
configurable-案例解析
// 设置属性描述符
Object.defineProperty(obj, 'name', {
value: 1,
writable: false, // 设置false表示不可写
enumerable: false // 设置false表示不可枚举
})
obj.name = 'abc'
console.log(obj.name) // 拿到的还是1
// 通过for in循环、Object.keys(obj)等等将获取不到name属性
接下来我们将了解configurable的作用,以上面为例
// 设置属性描述符
Object.defineProperty(obj, 'name', {
value: 1,
writable: false, // 设置false表示不可写
enumerable: false // 设置false表示不可枚举
})
// 因为configurable默认是true,它的意思就是可以重新修改属性描述符本身
// 即便上面writable已经设置成false
Object.defineProperty(obj, 'name', {
writable: true, // 重新设置成true
})
obj.name = 'abc'
console.log(obj.name) // 这个时候拿到的就是abc
<--- 分割线:如果configurable设置成了fasle --->
Object.defineProperty(obj, 'name', {
value: 1,
writable: false, // 设置false表示不可写
enumerable: false // 设置false表示不可枚举
configurable: false // 不可修改描述符本身
})
Object.defineProperty(obj, 'name', {
writable: true, // 重新设置成true
})
这个时候就会报错了
访问器get和set
var obj = {};
var temp = undefined;
Object.defineProperty(obj, 'name', {
// 读取器 getter
get() {
return temp;
}
// 设置器 setter
set(val){
temp = val;
}
})
故名思意,就是我们通过obj.某个属性,就会触发get()方法,当我们通过obj.某个属性进行赋值的时候,比如obj.name = 111,这时候就会触发set()方法,而此时val就是111。
以上就是关于属性描述符的基础的知识