属性类型为了实现javascript 引擎用的,因此在javascript中不能访问它们。为了表示特性是内部值,规范中约定将它们定义到两对方括号中,如:[[Enumerable]]
属性类型分为两种:数据属性和访问器属性
数据属性(数据描述符)
数据属性包含一个数据值的位置。可以进行读写操作。包括4个描述其行为的特性
- [[Configurable]] 表示该属性能否进行修改或删除操作,能否把属性修改为访问器属性。如果旧描述符将其configurable 属性设置为false,则该属性被认为是“不可配置的”,并且没有属性可以被改变(除了单向改变 writable 为 false)。当属性不可配置时,不能在数据和访问器属性类型之间切换。
- [[Enumerable]] 表示能否通过for-in循环,也就是是否可枚举
- [[Writeable]] 表示能否修改该属性,当writable属性设置为false时,该属性被称为“不可写”。试图写入非可写属性不会改变它,也不会引发错误。
- [[Value]] 表示这个属性的数据值,用于读取属性值。写入新值时,这个旧值会被替换。默认值undefined
访问器属性(存取描述符)
访问器属性不包含数据值,它们包含两个函数分别时getter 和 setter (这两个函数不是必须的)。在读取访问器属性时,会调用getter方法;在写入访问其属性时,会调用setter方法并会传入一个参数为新值。同样包括几个特性。如下:
- [[Get]] 在读取访问器属性时,会调用getter方法。 默认值undefined
- [[Set]] 在写入访问其属性时,会调用setter方法并会传入一个参数为新值。默认值undefined
一些操作这些属性的方法
- Object.defineProperty()
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
语法
Object.defineProperty(obj, prop, descriptor)
参数
-
obj
要在其上定义属性的对象。 -
prop
要定义或修改的属性的名称。 -
descriptor
将被定义或修改的属性描述符。
返回值
被传递给函数的对象。
ES6
在ES6中,由于 Symbol类型的特殊性,用Symbol类型的值来做对象的key与常规的定义或修改不同,而Object.defineProperty 是定义key为Symbol的属性的方法之一。
如果一个描述符不具有value,writable,get 和 set 任意一个关键字,那么它将被认为是一个数据描述符。如果一个描述符同时有(value或writable)和(get或set)关键字,将会产生一个异常
实例
var o = {}; // 创建一个新对象
// 在对象中添加一个数据属性的示例
Object.defineProperty(o, "a", {
value : 37,
writable : true,
enumerable : true,
configurable : true
});
// 对象o拥有了属性a,值为37
// 在对象中添加一个访问器属性的示例
var bValue;
Object.defineProperty(o, "b", {
get: function(){
return bValue;
},
set: function(newValue){
bValue = newValue;
},
enumerable : true,
configurable : true
});
o.b = 38;
// 对象o拥有了属性b,值为38
// o.b的值现在总是与bValue相同
// 数据属性和访问器属性不能混合使用
Object.defineProperty(o, "conflict", {
value: 0x9f91102,
get: function() {
return 0xdeadbeef;
}
});
// Uncaught TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute, #
- Object.defineProperties()
Object.defineProperties() 方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。
语法
Object.defineProperties(obj, props)
参数
-
obj
在其上定义或修改属性的对象。 -
props
要定义其可枚举属性或修改的属性描述符的对象。对象中存在的属性类型主要有两种:数据属性和访问器属性
返回值
传递给函数的对象。
实例
var obj = {};
Object.defineProperties(obj, {
'property1': {
value: true,
writable: true
},
'property2': {
value: 'Hello',
writable: false
}
// etc. etc.
});