对象
对象拥有属性,
属性类型
数据属性和访问器属性
数据属性
数据属性包含数据值:Value
数据属性的特征(用来描述数据属性的行为):
[[Configurable]]:
- 能否通过delete 删除属性从而重新定义属性
- 能否修改属性的特性
- 能否把属性修改为访问器属性
[[Enumerable]]
-表示能否通过for-in 循环返回属性
[[Writable]]
-能否修改属性的值
[[Value]]
-包含这个属性的数据值,是属性的读写位置 默认undefined
修改特征:
需要使用Object.defineProperty()方法: —-(ES5)
Object.defineProperty(obj,”name”,{描述符对象})
var person = {};
Object.defineProperty(person, "name", {
writable: false,//特征 不能修改属性的值
value: "Nicholas"//特征 本是读写位置 但因writable:false 所以只读
/*描述符对象*/
});
alert(person.name); //"Nicholas"
person.name = "Greg";
alert(person.name); //"Nicholas"
/*高程代码 DataPropertiesExample01.htm 【p140】*/
var person = {};
Object.defineProperty(person, "name", {
configurable: false,
//- 不能通过delete 删除属性从而重新定义属性 (1)
//- ***不能修改属性的特性 *** (2)
//- 不能把属性修改为访问器属性 (3)
value: "Nicholas"
});
//抛出错误
Object.defineProperty(person, "name", {
configurable: true,//因为(2)所以此时再次修改 报错
value: "Nicholas"
});
/*在调用Object.defineProperty()方法时,如果不指定,configurable、enumerable 和writable 特性的默认值都是false*/
/*直接在对象上设置属性时三个默认值都是true*/
IE8 是第一个实现Object.defineProperty()方法的浏览器版本。然而,这个
版本的实现存在诸多限制:只能在DOM对象上使用这个方法,而且只能创建访问器
属性。由于实现不彻底,建议读者不要在IE8 中使用Object.defineProperty()
方法。———————————————————-高程【P141】
访问器属性
访问器属性不包含数据值: (没有Value)
读:getter()函数
写:setter()函数
访问器属性的特征:
[[Configurable]]:
- 能否通过delete 删除属性从而重新定义属性
- 能否修改属性的特性
- 能否把属性修改为数据属性 (对比数据属性的特征)
- 默认为ture
[[Enumerable]]
-表示能否通过for-in 循环返回属性 直接在对象上定义的属性,这
个特性的默认值为true。
[[Get]]
-读取属性 默认undefined
[[Set]]
-设置属性 默认undefined
使用Object.defineProperty()来定义
var book = {
_year: 2004,//表示只能通过对象方法访问的属性
edition: 1
};
Object.defineProperty(book, "year", {
//year是访问器属性,影响到了_year和edition属性
get: function(){
return this._year;//返回_year属性值
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;//重新赋值_year
this.edition += newValue - 2004;//关连处理edition
}
}
});
book.year = 2005;
alert(book.edition); //2
//高程----AccessorPropertiesExample01.htm【p141】
支持ECMAScript 5 的这个方法的浏览器有IE9+(IE8 只是部分实现)、Firefox 4+、Safari 5+、Opera12+ 和Chrome 。
在这个方法之前, 要创建访问器属性, 一般都使用两个非标准的方法:_defineGetter_()和_defineSetter_()。这两个方法最初是由Firefox 引入的,后来Safari 3、 Chrome 1 和Opera 9.5 也给出了相同的实现。
var book = {
_year: 2004,
edition: 1
};
//定义访问器的旧有方法
book.__defineGetter__("year", function(){
return this._year;
});
book.__defineSetter__("year", function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
});
book.year = 2005;
alert(book.edition); //2
//AccessorPropertiesExample02.htm【p142】
定义多个属性
Object.defineProperties()方法。
var book = {};
Object.defineProperties(book, {
_year: {
value: 2004
},
edition: {
value: 1
},
year: {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
}
});
//MultiplePropertiesExample01.htm
读取属性的特征
Object.getOwnPropertyDescriptor()方法
收两个参数:
属性所在的对象
要读取其描述符的属性名称。
返回值:是一个对象,
如果是 访问器属性,
属性有configurable、enumerable、get 和set;
如果是 数据属性,
属性有configurable、enumerable、writable 和value
var book = {};
Object.defineProperties(book, {//定义多个属性
_year: {
value: 2004
},
edition: {
value: 1
},
year: {
get: function() {
return this._year;
},
set: function(newValue) {
if(newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
}
});
var descriptor = Object.getOwnPropertyDescriptor(book, "_year");//获取描述符对象
alert(descriptor.value); //2004
alert(descriptor.configurable); //false
alert(typeof descriptor.get); //"undefined"
var descriptor = Object.getOwnPropertyDescriptor(book, "year");
alert(descriptor.value); //undefined
alert(descriptor.enumerable); //false
alert(typeof descriptor.get); //"function"
//GetPropertyDescriptorExample01.htm【p143-144】
Object.getOwnPropertyDescriptor()方法