属性特性

2020-07-24  本文已影响0人  zhulichao
ES5定义了一个名叫“属性描述符”的对象,用于描述属性的各种特征,只能在Object.defineProperty或Object.defineProperties中使用。属性描述符对象有:

4个属性:

> configurable: 可配置性,表示能否修改属性特性,能否把属性修改为访问器属性,或者能否通过delete删除属性从而重新定义属性,默认true。设置为false后,再调用Object.defineProperty修改属性特性都会报错。
> enumerable: 可枚举性,表示能否通过for-in遍历得到属性,默认true。
> writable: 可写性,表示能否修改属性的值,默认为true。
> value: 数据属性,表示属性的值,默认为undefined。

2个存取器属性,分别是get和set,可以代替value和writable,存取器和value、writable不能同时存在:

> get: 在读取属性时调用的函数,只指定get则表示属性为只读属性,默认值为undefined。
> set: 在写入属性时调用的函数,只指定set则表示属性为只写属性,默认值为undefined。

```
// 修改obj的name属性特性
Object.defineProperty(obj, 'name', {
    writable: false,
    value: 'Tom',
)};
// 一次修改obj的多个属性特性
Object.defineProperties(obj, {
    _year: {
        value: 2017,
    },
    edition: {
        value: 1,
        writable: true,
    },
    year: {
        get: function() {
            return this._year;
        },
        set: function() { ... }
    }
});
// 读取属性特性
Object.getOwnPrototypeDescriptor(obj, '_year');
// 读取所有属性特性
Object.getOwnPrototypeDescriptors(obj);
```

Object.preventExtensions(obj) 禁止扩展,禁止给对象添加属性和方法,原有的属性可修改
Object.isExtensible(obj) 检查是否可扩展
Object.seal() 密封对象,不可扩展、不可删除属性
Object.isSeal() 检查是否密封
Object.freeze() 冻结对象,不可扩展、不可删除、不可修改属性
Object.isFrozen() 检查是否冻结
上一篇 下一篇

猜你喜欢

热点阅读