除了包含名字和值以外,属性还包含的一些标识它们可写、可枚举和可配置的特性。数据属性的4个特性分别是它的值(value)、可写性(writable)、可枚举性(enumerable)和可配置性(configurable)。存取器属性的4个特性是读取(get)、写入(set)、可枚举性和可配置性。函数
ECMAScript中有一个名为“属性描述符”(property descriptor)的对象,这个对象表明那4个特性。描述符对象的属性和他们所描述符的属性特性是同名的。所以数据属性的描述符对象有value、writable、enumerable和configurable。存取器属性的描述符对象则用get属性和set属性代替value和writable。其中writable、enumerable和configurable是布尔值,get属性和set属性是函数值。this
经过调用Object.getOwnPropertyDescriptor()能够得到某个对象特定属性的描述符:code
Object.getOwnPropertyDescriptor({x:1},"x"); //{value:1,writable:true,enumerable:true,configurable:true}
Object.getOwnPropertyDescriptor()只能获得自有属性的描述符。对象
要想设置属性的特性,或者想让新建属性具备某种特性,则须要调用Object.defineProperty(),传入要修改的对象,要建立或要修改的属性,以及属性描述符对象。继承
var o = {}; // 添加一个不可枚举的数据属性x,并赋值为1 Object.defineProperty(o, "x", { value:1, writable: true, enumerable:false, configurable: true});
传入Object.defineProperty()的属性描述符对象没必要包含4个特性。对于新建立的属性来讲,默认的特性值是false或undefined。对于修改的已有属性来讲,默认的特性值没有作任何修改。这个方法要么修改已有属性要么新建自有属性,但不能修改继承属性。
若是要同时修改或建立多个属性,则须要使用Object.defineProperties()。第一个参数是要修改的对象,第二个参数是一个映射表,它包含要新建或修改的属性的名称,以及它们的属性描述符,例如:ip
var p = Object.defineProperties( x: { value:1, writable: true, enumerable:false, configurable: true}, y:{ value:1, writable: true, enumerable:false, configurable: true}, r: { get: function() { return Math.sqrtthis.x*this.x + this.y*this.y) }, enumerable:false, configurable: true } });
用Object.defineProperty()与Object.defineProperties()操做对象属性的特性也是要遵循必定的规则的。任何违反规则的使用会抛出类型错误异常。下面是完整的规则:get