红宝书第六、七章阅读笔记系列-访问器属性

–6.1 理解对象

ECMAScript中有两种属性:数据属性和访问器属性。
访问器的两种常用模式如下:

// 常用模式 1
const obj = {
    _prop: 1
};
Object.defineProperty(obj, 'prop', {
    get: function() {
        return this._prop;
    },
    set: function(value) {
        this._prop = value;
    }
})

// 常用模式 2
const obj = {};

(function() {
    let value = 0;

    Object.defineProperty(obj, 'prop', {
        get: function() {
            return value;
        },
        set: function(newValue) {
            value = newValue;
        }
    })
})();

TIPS:prop和prop是两个不同的属性, 一般作为一种约定俗成的记号,表示私有变量,不可被随意篡改。

// 错误用法
const obj = {
    prop: 1
};
Object.defineProperty(obj, 'prop', {
    get: function() {
        return this.prop;
    },
    set: function(value) {
        this.prop = value;
    }
})

这里出错是因为在访问它的 prop 属性时,它的访问器里面又依赖 prop 属性,循环依赖,导致调用栈溢出。
红宝书第六、七章阅读笔记系列-访问器属性_第1张图片

TIPS:Object.getOwnPropertyDescriptor(obj, prop)方法可以取到对应属性的描述符,数据属性返回[Configurable/Enumerable/Writable/Value],访问器属性返回 [Configurable/Enumerable/Get/Set]。

经过测试,不指定时,这些特性的默认值都是true。与原书有出入。
这里写图片描述
支持ECMAScript5的这个方法的浏览器有IE9+、Firefox4+、Safari5+、opera12+和chrome。在这之前,非标准创建访问器属性的方法是defineGetter{}和defineSetter{}。

TIPS:Object.defineProperties()方法可以一次性定义多个属性。

你可能感兴趣的:(ecmascript6,对象,object)