参考书籍:《JavaScript高级程序设计3版》
属性类型:
有两种数据类型: 数据属性和 访问器属性
数据属性:
数据属性包含一个数据值value
数据属性有4个描述特性
configurable : 默认true。 如果为false 不能delete;注意一旦把属性这个特性配置为false, 就不能再变回true了。
enumerable : 默认 true. 如果为false 不能 for-in 返回属性
writable : 默认 true. 表示能否修改属性的值
value : 默认 undefined 读取属性值从这里读取;写入属性值时把新值保存在这个地方。
怎么设置属性的特性呢?
Object.defineProperty()方法, 如果不指定configurable, enumerable, writable的特性都是false
访问器属性 有4个特性
configurable : 默认true
enumerable : 默认true
get : 默认undefined ,在读取属性时调用函数
set : 默认undefined ,再写入属性时调用函数
注意访问器属性不能直接定义,必须使用Object.defineProperty()来定义。
什么情况下使用访问器属性: 常见的是,设置一个属性的值会导致其他属性发生变化
var person = {
name:"liang",
age:29,
job:"software Engineer",
sayName:function(){
alert(this.name);
}
};
//2.
var person = {};
Object.defineProperty(person,'name',{
writable:false,
value:'liang'
});
alert(person.name);
person.name = "greg";
alert(person.name);
//3.p158
var person = {};
Object.defineProperty(person,"name",{
configurable:false,
value:"zhao"
});
Object.defineProperty(person,"name",{
configurable:true,
value:"liang"
});
//4.p159 访问器属性
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;
alert(book._year);
alert(book.year);
alert(book.edition);
我想一次定义多个属性 有这样方法吗?
Object.defineProperties()
//定义多个属性p160
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;
}
}
}
});
怎么读取属性的特性?
Object.getOwnPropertyDescriptor()方法
在JavaScript中,可以对任何对象使用Object.getOwnPropertyDescriptor()方法,包括DOM和BOM对象。
//p161 访问属性的特性
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