属性
ECMAScript中有两种属性:数据属性和访问器属性
数据属性
概念:数据属性包含属性的值的位置,在这个位置可进行读取、写入
特性:1.[[Configurable]]:能否删除属性、修改属性的特性,默认值为true
2.[[Writable]]:能否修改属性的值,默认值为true
3.[[Enumberable]]:能否枚举出该属性,默认值为true
4.[[Value]]:属性的值,默认值为undefined
访问器属性
概念:访问器属性不包含数据值,有一队getter()和setter()(这两个函数不是必须的),读取访问器属性会调用getter(),同理写入时会调用setter()
特性:1.[[Configurable]]:能否删除、修改属性的特性
2.[[Enmuberable]]:能否枚举出该属性
3.[[Get]]:读取属性时调用
4.[[Set]]:写入属性时调用
修改属性特性
Object.defineProperty()
接收三个参数,第一个参数:属性所在对象,第二个参数:属性名字,第三个参数:特性,例如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32var person = {};
<!-- 若第三个参数未设置,则configurable、enumberable、writable默认为false -->
Object.defineProperty(person, "name", {
configurable: true, //该属性设置为false则不可再更改为true,若设置为false只能修改writable特性
writable: false,
enumberable: false,
value: "me"
});
var book = {
_year: 2017 // _XXX代表只能通过对象方法访问该属性
};
<!-- 只指定getter()意味着不能写,同样地只指定setter()意味着不可读 -->
Object.defineProperty(book, "year", {
get: function() {
return this._year;
},
set: function(newYear) {
this_year = newYear;
}
});
<!-- 定义访问器属性的旧方法 -->
book.__defineGetter__("year", function() {
return this._year;
};
book.__defineSetter__("year", function(newYear) {
this._year = newYear;
}
Object.defineProperties()
用于同时定义多个属性,该方法接收两个参数,第一个参数是对象,第二个参数是对象的属性1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17var book = {};
Object.defineProperties(book, {
_year: {
writable: true,
value: 2017
},
year: {
get: function() {
return this._year;
},
set: function(newYear) {
this_year = newYear;
}
}
})
获取属性特性
Object.getOwnPropertyDescriptor()
用于获取指定对象中指定属性的描述符(仅限与实例对象,原型属性需要在原型对象上调用),第一个参数是对象,第二个参数是指定属性的名称1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20var book = {};
Object.defineProperties(book, {
_year: {
writable: true,
value: 2017
},
year: {
get: function() {
return this._year;
},
set: function(newYear) {
this_year = newYear;
}
}
});
var des = Object.getOwnPropertyDescriptor(book, "_year");
console.log(des); //{value: 2017, writable: true, enumerable: false, configurable: false}
Object.getOwnPropertyDescriptors
用于获取指定对象中所有属性的描述符(仅限与实例对象,原型属性需要在原型对象上调用),接收一个对象参数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21var book = {};
Object.defineProperties(book, {
_year: {
writable: true,
value: 2017
},
year: {
get: function() {
return this._year;
},
set: function(newYear) {
this_year = newYear;
}
}
});
var des = Object.getOwnPropertyDescriptors(book);
console.log(des); //year:{get: ƒ, set: ƒ, enumerable: false, configurable: false}
//_year:{value: 2017, writable: true, enumerable: false, configurable: false}