数据属性和访问器属性
| 数据属性 | 访问器属性 |
共同特性 | [[enumerable]] |
[[configurable]] |
特有特性 | [[writable]] | [[get]] |
[[value]] | [[set]] |
设置单个属性方法 | Object.defineProperty(obj, prop, descriptor) |
设置多个属性方法 | Object.defineProperties(obj, props) |
读取单个属性描述符 | Object.getOwnPropertyDescriptor(obj, prop) |
读取对象所有属性描述符 | Object.getOwnPropertyDescriptors(obj) |
备注 | obj: 需要被操作的目标对象;prop: 目标对象需要定义(读取)或修改的属性的名称;descriptor: 将被定义或修改的属性的描述符;props: 该对象的一个或多个键值对定义了将要为对象添加或修改的属性的具体配置; |
特性详情
-
[[Configurable]]
:
- 表示能否通过
delete
删除属性从而重新定义属性,(设置为false,表示不能从对象中删除属性(在严格模式下调用delete
会报错)), - 能否修改属性的特性,
- 能否把数据属性修改为访问器属性(或相反),
- 从
true
修改为false
是单向的,即一旦把把属性定义为不可配置的,就不能再把它变回可配置了(此时只能单向修改writable
从true
到false
)。
-
[[Enumerable]]
: 表示能否通过for-in
循环返回属性 -
[[Writable]]
: 表示能否修改属性的值 -
[[Value]]
: 包含这个属性的数据值 -
[[Get]]
: 读取属性时调用的函数,默认值为undefined
-
[[Set]]
: 写入属性时调用的函数,默认值为undefined
其中直接在对象上定义的属性, [[Configurable]]
, [[Enumerable]]
, [[Writable]]
默认值均为true; 通过 Object.defineProperty()
方法或 Object.defineProperties()
方法,如果不指定 writale
, enumerable
, configurable
的值,则全部默认为 false。
定义属性
定义单个属性
Object.defineProperty(book, 'actor', { value: 'Nicholas'})
定义多个属性
var book = {}Object.defineProperties(book,{ _year:{ writable: true, value: 2004 }, edition:{ writable: true, value: 1 }, // year为访问器属性 year:{ get: function(){ return this._year; }, set: function(newValue){ if(newValue > 2004){ this._year = newValue; this.edition += newValue - 2004; } } }});// {_year: 2004, edition: 1}
读取属性的描述符
读取单个属性的描述符
Object.getOwnPropertyDescriptor(book, '_year'); // {value: 2006, writable: true, enumerable: false, configurable: false}Object.getOwnPropertyDescriptor(book, 'edition'); // {value: 3, writable: true, enumerable: false, configurable: false}Object.getOwnPropertyDescriptor(book, 'year'); // {get: ƒ, set: ƒ, enumerable: false, configurable: false}Object.getOwnPropertyDescriptor(book, 'actor'); // {value: "Nicholas", writable: false, enumerable: false, configurable: false}
读取所有属性的描述符
Object.getOwnPropertyDescriptors(book)
注意
从上面代码 Object.getOwnPropertyDescriptor()
执行结果中可以看出来, 通过Object.defineProperty()
方法或Object.defineProperties()
方法,如果不指定数据属性或访问器属性的writale
, enumerable
, configurable
的值,则全部默认为 false
。