对象属性
创建对象方式:
1 var person = new Object(); 2 person.name = "Nicholas"; 3 person.age = 29; 4 person.job = "Software Enginner"; 5 6 person.sayName = function(){ 7 alert(this.name); 8 };
或者
1 var person = { 2 name: "Nicholas", 3 age: 29, 4 job: "Software Engineer", 5 6 sayName: function(){ 7 alert(this.name); 8 } 9 };
属性类型:
ECMAScript中有两种属性:数据属性和访问器属性
1、数据属性:(4个)
[[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为true。
[[Enumerable]]:表示能否通过for-in循环返回属性。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为true。
[[Writable]]:表示能否修改属性的值。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为true。
[[Value]]:包含这个属性的数据值。读取属性值的时候,从这个位置读;写入数据值的时候,把新值保存在这个位置。这个特性的默认值为undefined。
要修改属性默认的特性,必须使用ECMAScript5的Object.defineProperty()方法。这个方法接收三个参数:属性所在的对象、属性的名字和一个描述符对象。其中,描述符(descriptor)对象的属性必须是:configurable、enumerable、writable和value。设置其中的一或多个值,可以修改对应的特性值。
exp:
1 var person = {}; 2 Object.defineProperty(person,"name",{ 3 writable:false, 4 value:"Nicholas" 5 }) 6 7 alert(person.name); //"Nicholas" 8 person.name = "Greg"; 9 alert(person.name); //"Nicholas"
writable设置为false,name属性的值不可修改。
注意:一旦把属性定义为不可配置的,就不能再把它变回可配置了。即把configurable设置为false,此时再调用Object.defineProperty()方法修改除writable之外的特性,都会导致错误。
2、访问器属性:(4个)
[[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。对于直接在对象上定义的属性,这个特性的默认值为true。
[[Enumerable]]:表示能否通过for-in循环返回属性。对于直接在对象上定义的属性,这个特性的默认值为true。
[[Get]]:在读取属性时调用的函数。默认值为undefined。
[[Set]]:在写入属性时调用的函数。默认值为undefined。
访问器属性不能直接定义,必须使用Object.defineProperty()来定义。
exp:
1 var book = { 2 _year:2004, 3 edition:1 4 }; 5 6 Object,defineProperty(book,"year",{ 7 get:function(){ 8 return this._year; 9 }, 10 set:function(newValue){ 11 if(newValue > 2004){ 12 this._year = newValue; 13 this.edition += newValue - 2004; 14 } 15 } 16 }); 17 18 book.year = 2005; 19 alert(book.edition); //2
定义多个属性:
Object.defineProperties()方法。这是方法可以通过描述符一次定义多个属性。这个方法接收两个对象参数:第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象中要添加或修改的属性一一对应。
exp:
var book = {};
Object.defineProperties(book,{
_year:{
writable:true,
value:2004
},
edition:{
writable:true,
value:1
},
year:{
get:function(){
return this._year;
},
set:function(newValue){
if(newValue > 2004){
this._year = newValue;
this.edition += newValue - 2004;
}
}
}
});
读取属性的特性:
Obeject.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符。这个方法接收两个参数:属性所在的对象和要读取其描述符的属性名称。返回值是一个对象,如果是访问器属性,这个对象的属性有configurable、enumerable、get和set;如果是数据属性,这个对象的属性有configurable、enumerable、writable和value。
exp:
1 var book = {}; 2 3 Object.defineProperties(book,{ 4 _year:{ 5 writable:true, 6 value:2004 7 }, 8 9 edition:{ 10 writable:true, 11 value:1 12 }, 13 14 year:{ 15 get:function(){ 16 return this._year; 17 }, 18 19 set:function(newValue){ 20 if(newValue > 2004){ 21 this._year = newValue; 22 this.edition += newValue - 2004; 23 } 24 } 25 } 26 }); 27 28 var descriptor = Object.getOwnPropertyDescriptor(book,"_year"); 29 alert(descriptor.value); //2004 30 alert(descriptor.configurable); //false 31 alert(typeof descriptor.get); //"undefined" 32 33 var descriptor = Object.getOwnPropertyDescriptor(book,"year"); 34 alert(descriptor.value); //undefined 35 alert(descriptor.enumerable); //false 36 alert(typeof descriptor.get); //"function"