es6属性描述符

本文介绍了ES6中的属性描述符,包括value、configurable、enumerable和writable等属性,以及如何通过Object.getOwnPropertyDescriptor()获取属性描述符。此外,还讲解了存取器属性的概念,当get和set存在时,属性变为存取器属性,读写操作会触发相关函数。通过实例展示了如何定义和使用属性描述符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

属性描述符是什么?

属性描述符是一个普通对象,用于描述一个属性的相关信息

Object.defineProperty(对象,属性)可以设置对象的属性描述符
Object.definePropertys(对象,属性)可以设置对象多个属性的属性描述符

通过Object.getOwnPropertyDescriptor(对象,属性名)可以得到一个对象的某个属性的属性描述符

  • value:属性值
  • configurable:该属性的描述符是否可以被修改
  • enumerable:该属性是否可以被枚举
  • writable:该属性是否可以被重新赋值

通过Object.getOwnPropertyDescriptors(对象)可以得到某个对象的所有属性描述符

存取器属性

属性描述符中,如果配置了get和set中的任何一个,则该属性,不再是一个普通属性,而变成了存取器属性。
get和set配置都是函数,读取该属性时,会运行get方法,将get方法的返回值作为属性值,如果给该属性赋值,则会运行set方法。

例子

1.可以修改描述符

const obj = {
      a : 1,
      b : 2
}
Object.defineProperty(obj, 'a', {
      value : 3,
      configurable : true,   //属性描述符能修改
      enumerable : false,     //不能枚举 for in无法循环到
      writable : false    //属性只读
})
obj.a = 4;
console.log(obj);//{a:3,b:2}

//如果重新修改描述符
Object.defineProperty(obj,'a',{
      writable:true
})
obj.a = 4;
console.log(obj);
//如果configurable的值为false,那么就不能再次修改描述符

在这里插入图片描述
a无法被枚举

for (const key in obj) {
    console.log(key);
}

在这里插入图片描述
2.另一种配置方法

Object.defineProperties(obj, {
   a : {
       value : 10,
       configurable : false,
       enumerable : false,
       writable : false
       },
   b : {
	  writable : false	
	}
})

3.获取属性描述符

const obj = {
      a : 1,
      b : 2
}
        
Object.defineProperties(obj, {
      a : {
          value : 10,
          configurable : false,
          enumerable : false,
          writable : false
     },
     b : {
          writable:false
     }
})

const props = Object.keys(obj)
console.log(props)

const values = Object.values(obj);
console.log(values);

const desc = Object.getOwnPropertyDescriptor(obj, "a")
console.log(desc);

在这里插入图片描述
4.存取器属性

const obj = {
            b: 2
}
Object.defineProperty(obj, "a", {
       get() {
           console.log("运行了属性a的get函数")
           return obj._a;
},
      set(val){
           console.log("运行了属性a的set函数", val)
           obj._a = val;
}
})
obj.a = 20 + 10; // set(20 + 10)
console.log(obj.a); // console.log(get())

在这里插入图片描述

obj.a = obj.a + 1; // set(obj.a + 1)   set(get() + 1)
console.log(obj.a);

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值