Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
语法
Object.defineProperty(obj, prop, descriptor);
参数
- obj
要在其上定义属性的对象。 - prop
要定义或修改的属性的名称。 - descriptor
将被定义或修改的属性描述符。
在ES6中,由于 Symbol类型的特殊性,用Symbol类型的值来做对象的key与常规的定义或修改不同,而Object.defineProperty 是定义key为Symbol的属性的方法之一。
属性描述符
-
configurable
值: true/false;
只有值为true时,该属性的描述符才能改变,同事该属性也能从对应的对象上删除。默认值为false -
enumerable
值: true/false
只有值为true时,该属性为可枚举属性。默认值为false -
value
值: 任何有效的javascript数据类型
value为当前设置属性对应的值,默认为undefined -
writable
值: true/false
只有值为true时,value才能被赋值运算符改变。默认值为false
存取描述符同时具有以下可选键值
-
get
一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this对象(由于继承关系,这里的this并不一定是定义该属性的对象)。
默认为 undefined。 -
set
一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。
默认为 undefined。