1. 对象属性特性
- 对象由属性组成。属性创建时会带有一些特征值,用来描述属性。
- 根据对象属性特性,属性分两种——数据属性与访问器属性
var person = {
name = 'Emily'
}
2. 数据属性
包含数据值,value
- 数据属性4个特性
-
configurable
能否修改属性特征,能否通过delete
删除,能否转化为访问器属性 -
enumerable
能否通过for-in
遍历 -
writable
能否修改属性值 -
value
属性数据值
-
-
Object.defineProperty(对象,属性,{特征名:特征值})
修改属性特性
var person = {};
Object.defineProperty(person, 'name', {
writable: false,
value: 'A'
})
alert(person.name) //A
person.name = 'B'
alert(person.name) //B
- 通过
Object.defineProperty()
创建的属性,configurable
默认值为false
。且,configurable
为false
后,永远是false
。 - 通过对象创建的属性,
configurable
enumerable
writable
默认都为true
3. 访问器属性
不包含数据值,通过get
set
访问属性。且必须通过Object.defineProperty()
创建访问器属性
- 访问器属性4个特性
-
configurable
(同数据属性) -
enumerable
(同数据属性) -
get
读取属性时调用的函数 -
set
写入属性时调用的函数
-
- 通过
Object.defineProperty()
创建访问器属性
var obj = {
a: 2,
b: 4
}
Object.defineProperty(obj, 'c', {
get: function() {
return this.a
},
set: function(newA) {
this._a = newA
this.b = this.b + newA
}
})
obj.c = 3
alert(obj.b) //7, 修改访问器属性值,有可能使其他属性改变
只定义get
,访问器属性只可读;只定义set
,访问器属性只可写。
4. 定义多个属性
通过Object.defineProperties
定义多个属性特性,语法:
Object.defineProperties(对象,{
属性名: {
特征名: 特征值,
特征名: 特征值
},
属性名: {
特征名: 特征值,
特征名: 特征值
}
})
5. 读取属性特性
通过Object.getOwnPropertyDescriptor(对象,属性)
方法,读取属性特征对象。
var o = Object.getOwnPropertyDescriptor(person,'name')
alert(o.writable) //false