属性描述符
JS 提供了一个内部数据结构,用来描述对象的值、控制其行为。称为属性描述符。
对象里存在的属性描述符有两种形式,数据描述符和存取描述符。
数据描述符
数据描述符是一个具有值的属性,数据描述符的键值如下:
- value:该顺序对应的值,可以为任意有效的值(例如数值、对象、函数),默认为 undefined。
- writable:值为 true/false,当为 true 时代表value能被改变。
- configurable:值为 true/false,当为 true 时代表属性描述符才能被改变,该属性也能删除。默认为 false。
- enumerable:值为 true/false,为 true 时才能出现在枚举属性中,默认为 false。
存取描述符
存取描述符由 getter-setter 函数对描述的属性,具有以下键值:
- get:为属性提供 gitter 方法,若没有则为undefined。
- set:为属性提供 setter 方法,若没有则为undefined。
- configurable:值为 true/false,当为 true 时代表属性描述符才能被改变,该属性也能删除。默认为 false。
- enumerable:值为 true/false,为 true 时才能出现在枚举属性中,默认为 false。
获取属性描述符
Object.getOwnPropertyDescriptor() 方法可以获取指定对象上一个属性的属性描述符。
语法结构:
Object.getOwnPropertyDescriptor(obj, prop);
- obj:要获取的对象
- prop:对象中的某个属性,String类型
- 返回值:返回属性描述符对象,若 prop 参数的属性不存在则返回 undefined。
如下代码:
function Person(){
this.name = 'hjj';
this.sayMe = function () {
console.log(this);
}
}
p = new Person();
var result = Object.getOwnPropertyDescriptor(p, 'name');
console.log(result instanceof Object);
结果:
{ value: 'hjj', writable: true, enumerable: true, configurable: true }
true
可以看到boolean 类型的返回值都为 true,而上面描述中默认值为 false,这点需要注意。这也是为什么我们可以在对象中
删除属性删除方法的原因。
需要注意的是,通过定义对象(属性或方法)获取的是数据操作符
由于返回的是对象,所以可以调用其中的方法,如下代码所示:
function Person(){
this.name = 'hjj';
this.sayMe = function () {
console.log(this);
}
}
p = new Person();
var result = Object.getOwnPropertyDescriptor(p, 'name');
console.log(result.value);
结果:
hjj
设置属性描述符
Object.defineProperty() 方法为对象定义新属性、或修改现有的属性,并返回这个对象。
语法结构:
Object.defineProperty(obj, prop, descriptor);
- obj,定义属性的对象
- prop,定义或者修改的属性名
- descriptor,属性修饰符