Object.defineProperty属性描述符

题外话:好久没更新了,媳妇生了孩子,白天上班晚上带娃,根本没有学习更新的时间,还真是少壮不努力 老大徒伤悲,年轻的朋友们,趁年轻真的得多学一点东西,特别现在这个就业环境,难绷。。。
我们都知道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。

以上就是关于属性描述符的基础的知识

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容