浅谈属性描述符(es5之后)

1.在ES5之前,JavaScript语言本身并没有提供可以直接检测属性特性的方法,比如判断属性是否可读。
2.如何获得一个属性的描述符,或者属性的描述符有哪些?

 let obj = {
        a: 1,
        obj2: {
            b: 2
        }
    }
Object.getOwnPropertyDescriptor(obj, 'a')

Object.getOwnPropertyDescriptor(obj, 'a')该方法获取属性描述符,有四个:

configurable: true
enumerable: true
value: 1
writable: true

3.如何修改已有属性,或者添加一个新属性呢?
Object.defineProperty()

 Object.defineProperty(obj, 'a', {
            configurable: false,
            writable: false,
            enumerable: false
        })

只要属性是可配置的,即configurable: true。就可以使用Object.defineProperty()来修改属性描述符。
注意:当属性初始描述符configurable: false时,再次定义,有以下几点注意:
1.configurable: false为单向操作,无法撤销。即,无法再变为true。
2.该属性不可删除。
3.属性描述符writable可以由true更改为false,但不能反过来。enumerable不能由true改为false,反过来也不行。
4.当writable = true时,数据值value,可以修改。
5.很重要的一点,所有的方法创建都是浅不变性。它们只会影响目标对象和它的直接属性。如果有属性值为对象的。其内容仍然是可变的。
属性的可枚举性
1.该描述符控制属性是否出现在对象的属性枚举中,即是否可用for...in遍历到该属性。
另外,当一个对象的属性直接用Object.defineProperty()来定义时,若只定义了value值,那么其他的属性描述符的值都为false。
例子:

 const obj = {
    }
    Object.defineProperty(obj, 'name', {
        value: 'cst'
    })
    obj.name = 'ha';
    console.log(obj.name); // cst

Object.getOwnPropertyDescriptors(obj)来查看。
在这里插入图片描述
若是用对象字面量定义时,则为true。

 const obj = {
        name: 'cst'
    }
    obj.name = 'ha';
    console.log(obj.name); // ha
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值