面向对象的语言有一个标志,那就是它们都有类的概念。而通过类可以创建任意多个具有相同属性和方法的对象。前面提到过,ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同。
ECMAScript-262把对象定义为:”无序属性的集合,其属性可以包含基本值,对象或者函数。”
严格来讲,这就相当于说对象是一组没有特定顺序的值。对象的每个属性或方法都有一个名字,而每个名字都映射到一个值。正因为这样,我们可以把ECMAScript的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数。
每个对象都是基于一个引用类型创建的,这个引用类型可以是原生类型,也可以是开发人员定义的类型。
属性类型
ECMAScript中有两种属性:数据属性和访问器属性
1.数据属性(property的属性)
要修改属性默认的特性,必须使用ECMAScript 5的Object.defineProperty()方法。这个方法接受三个参数:属性所在的对象,属性的名字和一个描述符对象。IE8对ECMAScript3支持的很好,对ECMAScript5的新特性并不支持。所以如果你使用的是IE8,那么就不能是用Object.
defineProperty()方法。
区分:
情景1:属性name的特性configurable,enumerable和writable特性的默认值都是true。但是调用Object.defineProperty()方法时,如果不指定,configurable, enumerable和writable特性的默认值都是false
<script type="text/javascript">
var person = {name : '高红成'};
alert(person.name);//高红成
delete(person.name);
alert(person.name);//undefined
</script>
情景2:
<script type="text/javascript">
var person = {name : '高红成'};
Object.defineProperty(person,”name”, {});
alert(person.name);//高红成
delete(person.name);//因为configurable为false
alert(person.name);//高红成
</script>
2.访问器属性
访问器属性不包含数据值;它们包含一个getter和setter函数(不过,这两个函数都不是必需的)。在读取访问器属性时,会调用getter函数,这个函数负责返回有效值;在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理数据。
访问器属性不能直接定义,必须使用Object.defineProperty()来定义。看下面的例子。
script type="text/javascript">
var book = {
_year : 2004,/*_year前面的下划线是一种常用的标记,下划线必须,用于表示只能通过对象方法访问属性*/
edition : 1
};
/*在IE9+中使用Object.defineProperty(),
在IE8-中使用book.__defineSetter__(“year”, {})和book.__defineGetter__(),eg:
var book = { _year : 2001};
book.__defineSetter__('year',function(newvalue){
if(newvalue > 2004){
this._year = newvalue;
this.edition += newvalue - 2004;
}
});
*/
Object.defineProperty( book, "year", {
set : function(newvalue){
if(newvalue > 2004){
this._year = newvalue;
this.edition = newvalue - 2004;
}
},
get : function(){
return this._year;
}
});
book.year = 2012;//year前面不需要加下划线”_”,这样会调用访问器方法来设置值
alert(book.year);
alert(book.edition);
</script>
3.读取属性的特性
使用ECMAScript5的Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符。这个方法接受两个参数:属性所在的对象和要读取其描述符的属性名称。返回一个对象,如果是访问器属性,这个对象的属性有configurable,enumerable, get 和set;如果是数据属性,这个对象的属性有configurable, enumerable, writable和value。
<script type="text/javascript">
var book = {year : 2010};
var descriptor = Object.getOwnPropertyDescriptor(book, "year");
alert(descriptor.value);
alert(descriptor.configurable);
</script>
本文详细介绍了ECMAScript中的对象概念及其属性类型,包括数据属性和访问器属性的区别及应用方式,并提供了具体的实现案例。

被折叠的 条评论
为什么被折叠?



