读书分享(JavaScript高级程序设计)_js对象属性

数据属性

数据属性包含一个数据值的位置,在这个位置可以读取和写入值,数据属性有4个描述其行为的特性。
1.Configurable : 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认为true
2.Enumerable : 表示能否使用for-in循环返回属性,默认为true
3.Writable 表示能否修改属性的值,默认为true
4.Value : 包含这个属性的数据值,读取属性值的时候,从这个位置读,写入时保存到这个位置,默认为undefined

修改属性特性:

使用Object.defineProperty()方法,该方法接收三个参数:属性所在的对象、属性名、需要修改的特性一或多个值,如

var person = {};
Object.defineProperty(person, "name", {
writable: false,
value:"aaaa"
})
alert(person.name);//aaaa
person.name = "bbbb";
alert(person.name);//aaaa

这个例子创建了一个名为name的属性,它的值aaaa是只读的,所以不能被修改。
注意:在调用Object.defineProperty方法时,如果不指定configurable、enumerable、writable特性值,则默认值都是false。

访问器属性

访问器属性不包含数据值,它们包含一对getter和setter函数

var book = {
_year: 2004,
edition: 1
};
Object.defineProperty(book, "year", {
get: function () {
return this._year;
},
set: function (newValue) {
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
book.year = 2005; //执行了set访问器
alert(book.edition); //输出2

定义多个属性

Object.defineProperties方法可以通过描述符一次定义多个属性,这个方法接收两个对象参数:第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象要添加或修改的属性一一对应,例如:
var book = {};
Object.defineProperties(book, {
_year: {
value:2004
},
edition: {
value:1
},
year: {
get: function () {
return this._year;
},
set: function (newValue) {
this._year=newValue;
}
}
})

读取属性的特性

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

posted @ 2019-10-07 21:31  完美xtide  阅读(83)  评论(0编辑  收藏  举报