一、理解对象
1 什么是对象?
无需属性的集合,其属性可以包含基本值、对象或者函数。
可以把对象想象为散列表:无非就是一组 名-值对,其值是数据或函数。
1.1 属性类型
ECMAScript中有两种属性:数据属性和访问器属性
数据属性:
- [[ Configurable ]]:能否通过delete删除属性重新定义属性,能否修改属性特性,或者把属性修改为访问器属性。默认为true
- [[ Ebumberle ]]:能否通过for-in循环返回属性,默认为true
- [[ Writable ]]:能否改写属性值,默认为true
- [[ Value ]]:包含这个属性的数据值,默认为tundefined
要修改属性默认特性,要用 Object,defineProperty() 方法。这个方法接受三个参数:属性所在的对象、属性的名字、一个描述符(descriptor)对象。
var person ={}; Object.defineProterty(person,"name",{ configurable:false, value:"Nick" }); alert(person.name) //Nick person.name="Tim"; alert(preson.name); //Nick
非严格模式下赋值将被忽略,严格模式下赋值操作将会抛出错误。
一旦把configurable设置为false后,就再不能把它变回可配置了,即再设置为true后,会抛错误
在调用Object,defineProperty() 方法时,如果不指定,Configurable 、 Ebumberle、Writable 会默认为false.
1.2. 访问器属性
访问器属性不包含数据值,二是包含一对儿 getter 和 setter 函数(都不是必需的)。
在读取访问器属性时,会调用 getter 函数,这个函数负责返回有效函数值;
在写入访问器函数时,会调用setter 函数并传入新值,这个函数负责如何处理数据。
访问器的四个属性:
- [[ Configurable ]]:能否通过delete删除属性重新定义属性,能否修改属性特性,或者把属性修改为访问器属性。默认为true
- [[ Ebumberle ]]:能否通过for-in循环返回属性,默认为true
- [[ Get ]]:在读取属性时调用的函数,默认值为undefined
- [[ Set ]]:在写入属性时调用的函数,默认值为undefined
访问器属性不能直接定义,必须使用Object,defineProperty() 定义。
1.3 定义多个属性
为对象定义多个属性时用Object,defineProperties() 方法。接受两个对象:要添加或修改其属性的对象、要添加或修改的属性。
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; } } })
1.3 读取属性的特性
Object.getOwnPropertyDescriptor() 方法可以获得给定属性的描述符。
根据上面的例子
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.configurable); //false
alert(typeof descriptor.get) //function