ESMA把对象定义为:“无序属性的集合,其属性可以包含基本值,对象和函数”。严格的讲,这相当于说对象是一组没有特定顺序的值,对象的每个属性或方法都有一个名字,而每一个名字都映射到一个值。
1.理解对象
创建对象有对象字面量的方法,这种方法比较常用,也是比较推荐的。
1 var person ={ 2 name:'xu', 3 age:27, 4 sayName:function(){ 5 alert(this.name); 6 } 7 };
还有创建对象的实例的方法:
2.属性的类型
属性有两种类型:数据属性和访问器属性。
数据属性包含一个数据值的位置,在这个位置可以读取和写入值。数据属性有四个描述其行为的特性:
要修改默认属性的特性,必须使用ECMASript5的Object.defineProperty()方法,这个方法收三个参数:属性所在的对象,属性的名字和一个描述符对象。描述符对象的属性就是上面所说的四个特性。
注意点:把configurable设置为false,表示不能从对象中删除属性,如果对这个属性调用delete方法,在非严格模式下什么也不会发生,而在严格模式下会导致报错;而且,一旦把属性定为不可配置,就不能再把它变回可配置了。此时在调用Object.defineProperty()方法修改除writable以外的特性,都会导致报错。
也就是说,可以多次调用 Object.defineProperty()方法修改同一个属性,但在把 configurable 特性设置为 false 之后就会有限制了。
在调用 Object.defineProperty()方法时,如果不指定,configurable、enumerable 和 writable 特性的默认值都是 false。
访问器属性
访问器属性不包含数据值,包含一对getter和setter函数(这两个函数不是必须的),在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数,并传入新值,这个函数负责决定如何处理数据。访问器有四个特性。
访问器属性不能直接定义,必须使用Object.defineProperty()方法来定义。
不一定同时指定getter和setter。只指定getter意味着属性不能写,尝试写入属性会被忽略,严格模式下,尝试写入只指定了getter函数的属性会抛出错误。类似的,只指定setter属性的函数也不能读,否则在非严格模式下会返回undefined,严格模式下会抛出错误。
3.定义多个属性
定义多个属性的时候,ES5定义了新的方法Object.defineProperties()方法。利用这个方法,可以通过描述符一次定义多个属性。它接收两个对象参数:第一个对象是要添加和修改其属性的对象,第二个对象的属性和第一个对象中要添加或修改的属性一一对应。
4读取属性的特性
使用ES5中的Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符,这个方法接受两个参数:属性所在的对象,和要读取描述符的属性名称。
如上面的例子,可以得到: