JS 中对象的属性有两种,数据属性和访问器属性(accessor property ),属性有其自身的特性(arrribute),可以理解为关于属性的属性。
数据属性包含4个特性,分别是[[Configurable]], [[Enumerable]], [[Writable]], [[Value]]。
使用 Object.defineProperty 修改属性描述符时,若该属性之前不存在,除了代码里指定的特性值,其他特性值默认将是 false, 举例如下:
let obj = {}; obj.name = ‘test‘; Object.defineProperty(obj, ‘age‘, { writable: false }); Object.getOwnPropertyDescriptor(obj, ‘age‘); // 控制台输出信息如下:注意四个特性值均为 false Object {value: undefined, writable: false, enumerable: false, configurable: false}
访问器属性不能直接定义,必须使用 Object.defineProperty 来定义,包含4个特性,分别是[[Configurable]], [[Enumerable]], [[Get]], [[Set]]。试举例如下:
// 使用访问器属性的常见方式:设置一个属性的值会导致其他属性发生变化
let book = { _year: 2004, edition: 1 }; Object.defineProperty(book, ‘year‘, { get: function() { return this._year }, set: function(newValue) { if (newValue>2004) { this._year = newValue; this.edition += newValue - 2004; } } });
虽然我们也可以直接通过 book._year 访问,修改该属性,但是_year前面的下划线是一种常用记号,表示只能通过对象方法访问的属性,注意这是一种约定而不是语言本身的限制。
原文:http://www.cnblogs.com/waniya/p/7134087.html