defineProperty - cw84973570/Learning-notes GitHub Wiki
Object.defineProperty(obj, prop, descriptor)
- 用此方法定义的属性和普通属性不同,默认情况下不可枚举、不能修改、不能删除。
// 不能枚举、不能修改、不能删除foo属性
var obj = {}
Object.defineProperty(obj, 'foo', {
value: 'bar'
})
-
configurable
-
属性的描述器是否可配置,从字面意思上来理解便是属性的描述器(descriptor)能否被修改。
-
如果不在描述器中传递该参数,默认为false,即在配置后不能修改描述器,也不能删除该属性,注意
delete
会返回false,而不会报错。var obj = {} Object.defineProperty(obj, 'foo', { value: 'bar', writable: true, enumerable: true }) Object.defineProperty(obj, 'foo', { value: 'bar', writable: true, enumerable: false // 报错 Cannot redefine property: foo })
-
对于普通属性来说该描述符为true。
-
如果该描述符为false且writable为true,则可以修改writable和value的值。
-
-
enumerable
- 属性是否可枚举,也就是是否可以被
for...in
循环或Object.keys
方法遍历。 - 如果不在描述器里传递该参数,默认为false。
- 对于普通属性来说该描述符为true
- 属性是否可枚举,也就是是否可以被
数据描述器(data descriptor)
-
value
- 属性的值,默认值为undefined。
-
writable
- 属性是否可修改,如果不在描述器里传递该参数,默认为false。
访问描述器(accessor descriptor)
-
get
- 没有arguments但是会有this
- 因为继承的关系,this可能并不会指向定义该属性的对象。
- 方法的返回值作为该属性的值。
-
set
- 只有一个argument,值为设置的值
- this同get
如果一个访问器没有vaule
、writable
、get
和set
中的任意一个键,则它被认为是数据描述器。
如果同时有数据描述器和访问描述器,则会报错。