Object.definePropery
This method allows a precise addition to or modification of a property on an object. Normal property addition through assignment creates properties which show up during property enumeration (for...in
loop or Object.keys
method), whose values may be changed, and which may be deleted. This method allows these extra details to be changed from their defaults. By default, values added using Object.defineProperty()
are immutable. (因为默认的configurable, enumerable, writable 都为false)
总结下来说此方法能向对象精确添加或修改属性
正常情况下通过赋值,如
const obj = { a: 1};
obj.b = 2;
属性是可枚举,可修改,可删除,property的定义可以被修改(用新的descriptor替代默认), 而通过
Object.defineProperty(obj, key, { value : xxx })
添加的值是不可修改的, 因为默认的writable, enumerable, configurable值都是false
const obj = { a: 1 };
Object.getOwnPropertyDescriptor(obj, 'a')
{value: 1, writable: true, enumerable: true, configurable: true}
obj.b = 2;
Object.getOwnPropertyDescriptor(obj, 'b')
{value: 2, writable: true, enumerable: true, configurable: true}
Writable 属性
当writable属性设置为false时,该属性被称为“不可写”。它不能被重新分配。
Enumerable 特性
enumerable
定义了对象的属性是否可以在 for...in
循环和 Object.keys()
中被枚举。
Configurable 特性
configurable特性表示对象的属性是否可以被删除,以及除writable特性外的其他特性是否可以被修改。
描述符可同时具有的键值
configurable | enumerable | value | writable | get | set | |
---|---|---|---|---|---|---|
数据描述符 | Yes | Yes | Yes | Yes | No | No |
存取描述符 | Yes | Yes | No | No | Yes | Yes |
如果一个描述符不具有value,writable,get 和 set 任意一个关键字,那么它将被认为是一个数据描述符。如果一个描述符同时有(value或writable)和(get或set)关键字,将会产生一个异常。
翻译过来就是说一个属性,要么是数据描述符,要么是存取描述符,不能两者都有。有value和writable就不能有get和set, 反过来有get和set就不能有value和writable
getter
get语法将对象属性绑定到查询该属性时将被调用的函数。
其实是对应defineProperty get的简写,对应enumerable: true, configurable: true
{get prop() { ... } }
{get [expression]() { ... } }
prop 要绑定到给定函数的属性名。
var obj = {
log: ['a', 'b', 'c'],
get latest() {
if (this.log.length == 0) {
return undefined;
}
return this.log[this.log.length - 1];
}
}
等价于
Object.getOwnPropertyDescriptor(obj, 'latest')
{get: ƒ, set: undefined, enumerable: true, configurable: true}