javascript 理解对象--- 属性类型
ECMA-262 把对象定义为:无序属性的集合,其属性可以包含基本值、对象或者函数;
var Person = { name:"wsc", age :"25", job :"software engineer", sayname : function(){ alert(this.name) } } var person = new Object(); person.name="wsc"; person.age = "26"; person.job = "software engineer"; person.sayname=function(){ alert(this.name); }
ECMA-262 第5版中定义对象的两种属性:数据属性和访问属性;(为表示特性是内部值,规范将其放在两对方括号中,如[[Enumerable]])
1.数据属性:包含一个数据值的位置。在这个位置可以读取和写入值。
4个描述行为的特性;
(1).[[Configurable]] // 默认为true ,作用:可以delete删除属性从而重新定义属性;支持修改属性;支持把属性改成访问属性。
(2).[[Enumerable]] // 默认为true,作用:可以使用for-in 循环返回属性;
(3).[[writable]] // 默认为true ,作用:可以修改属性值;
(4).[[Value]] //默认undefined 作用:包含这个属性的数据值;
修改属性默认的特性 ,方法是Object.defineProperty(),参数(对象名,属性名,描述符对象),如;
var person={}; Object.defineProperty(person,"name",{ writable:false, value : "wsc" }); alert(person.name) ;//wsc person.name = "wscir";//在严格模式下,此操作会抛错 alert(person.name);//wsc;
注意:a.一旦将属性定义为不可配置的,就不能再把他变回可配置。此时在调用Object.defineProperty()方法修改除writable之外的特性,都会导致错误;
b.在调用Object.defineProperty()方法时,如果不指定,coonfigurable、enumerable、writable特性的默认值都是false;
c.只能在DOM对象上使用此方法,而且只能创建访问器属性,不要再IE8中使用Object.defineProperty()方法;
2.访问属性:不包含数据值,它包含一对getter和setter函数(都不是必须的),读取访问属性时 调用getter函数,写入访问属性时,调用setter函数。
4个描述行为的特性;
(1).[[Configurable]] // 默认为true ,作用:可以delete删除属性从而重新定义属性;支持修改属性;支持把属性改成访问属性。
(2).[[Enumerable]] // 默认为true,作用:可以使用for-in 循环返回属性;
(3).[[Get]] // 默认为undefined ,作用:读取属性时调用的函数;
(4).[[Set]] //默认undefined 作用:写入属性时调用的函数;
访问属性不能直接定义 ,必须使用Object.defineProperty()来定义,如;
var book={
_year : 2004,
edition : 1
};
Object.defineProperty(book,"year",{
get:function(){
return this._year;
},
set:function(newValues){
if(newValues > 2004){
this._year = newValues;
this.edition +=newValues - 2004
}
}
});
book.year = 2005 ;
alert(book.edition);//2;
//兼容浏览器有:IE9+ Firefox4+ Safari5+ Opera12+ 和chrome,不支持Object.defineProperty()方法的浏览器中不能修改[[configuarable]]、[[Enumerable]];
var book={
_year : 2004,
edition : 1
};
//定义访问器旧有的方法,由Firefox引入 Safari3 Opera9 和chrome1
Object._defineGetter_("year",function(){
return this._year;
});
Object._defineSetter_("year",function(newValues){
if(newValues > 2004){
this._year = newValues;
this.edition +=newValues - 2004
}
});
book.year = 2005 ;
alert(book.edition);//2;