–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 属性,循环依赖,导致调用栈溢出。
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()方法可以一次性定义多个属性。