var myObject = { a:2 }; Object.getOwnpropertyDescriptor(myObject,"a"); { value:2, writable:true, emumerable:true, configurable:true }
这段代码中的属性描述符不仅只有2,还有writable(可写)、enumerable(可枚举)、configurable(可配置)三种
在创建普通属性时属性描述符会使用默认值,我们也可以使用 Object.defineProperty(...)来添加一个新属性或者修改一个已有属性(如果是configurable)并对特性进行设置
代码示例:
var myObject = {}; Object.defineProperty(myObject,"a",{ value:2, writable:true, configurable:true, emumerable:true }); console.log(myObject.a);//2
下面是对这三个属性描述符的介绍:
1)writable:决定是否可以修改属性的值
var myObject = {}; Object.defineProperty(myObject,"a",{ value:2, writable:false, configurable:true, emumerable:true }); myObject.a = 3; console.log(myObject.a);//2
解析:writable:false 可以看作为属性不可改变,在严格模式("use strict";)下,引擎会抛出TypeError的异常,这表示我们无法修改一个不可写的属性
2)configurable:只要属性是可配置的,就可以使用 defineProperty(...)方法来修改属性描述符
注意!!
a)在false情况下,如果修改,不管是不是严格模式,都会抛出TypeError的错误
b)在这种情况下,我们仍可以将可写性的状态由true改为false
c)delete属性也会被禁止(delete myObject.a;)
3)emumerable:可枚举,如果将它设置为false,则这个属性将不会出现在枚举中,但可以正常访问他