对象的属性描述符

2019-06-14  本文已影响0人  Ronswhite

Javascript描述符

属性描述符

属性访问描述符(访问器)

属性描述符的使用

var obj = {
    key: "hello"
}

// 查看obj的属性key的属性描述符
console.log(Object.getOwnPropertyDescriptor(obj, "key")); //{value: "value", writable: true, enumerable: true, configurable: true}

// 设置obj的属性key的属性描述符
Object.defineProperty(obj, "key", {
    value: "newVal",    // 设置属性的值
    writable: false,    // 设置属性是否可写
    enumerable: true,   // 设置属性是否可枚举(可用for ... in ...遍历)
    configurable: true  // 设置属性是否可配置(可用defineProperty设置)及删除(delete key)
});

//设置常量属性
Object.defineProperty(obj, "key", {
    writable: false,
    configurable: false
});

阻止对象扩展

var obj = {
    a: 6
};

//阻止对象扩展 
Object.preventExtensions(obj);

obj.b = 999;    //b无法被添加
console.log(obj);   //{a: 6}

密封对象

Object.seal(obj);
相当于Object.preventExtensions(obj);及对obj对象的所有属性的属性描述符configurable改成false
即:对象不能添加和删除属性。

冻结对象

Object.freeze(obj);
相当于
Object.seal(obj);及对obj对象的所有属性的属性描述符writable改成false
即对象不能添加和删除属性,也不能修改属性的值。

属性访问描述符

访问描述符有两种定义方式

var obj = {
    set a(val) {
        console.log("setting a...");
        this._a_ = val * 2;
    },
    get a() {
        console.log("getting a...")
        return this._a_;
    }
};

Object.defineProperty(obj, "b", {
    set: function(val) {
        console.log("setting b...");
        this._b_ = val;
    },
    get: function() {
        console.log("getting b...");
        return this._b_;
    }
});
obj.a = 2;  //setting a...
obj.b = 3;  //setting b...
obj.a;      //getting a...
obj.b;      //getting b...
设置了访问器的对象

给对象定义属性访问描述符会在对象中创建不包含值的属性,对这个属性的访问会自动调用隐藏的函数(访问器getter和setter)

上一篇 下一篇

猜你喜欢

热点阅读