JavaScript并没有类的概念,因此它将对象定义为:“无序属性的集合,其属性可以包含基本值、对象或函数”。因此,我们也可以把对象看做散列表,里面有着键值对,值可以是数据或函数。
在JavaScript中,每个对象都是基于一个引用类型创建的。可以是原生的引用类型,也可以使自定义的引用类型。因此后面讨论的各种方法创建对象的实质就是创建自定义的引用类型。
接下来谈谈JavaScript中的属性概念。
JavaScript中属性分为两种,数据属性和访问器属性。
数据属性包含四个内置的特性(脑补:对属性进行定义的东西),[[Configurable]],[[Enumerable]],[[Writable]],[[Value]],分别对应设置属性是否可以删除,是否可枚举,是否可以修改和属性的值。
访问器属性也包含四个内置的特性,[[Configurable]],[[Enumerable]],[[Get]],[[Set]],分别对应设置属性是否可以删除,是否可枚举,读取属性调用的函数和写入属性调用的函数。
与属性相关的方法有defineProperty(),defineProperties(),getOwnPropertyDescriptor()。分别用于设置属性特性,设置多个属性特性和取得某个属性的特性描述符。
相对于数据属性,访问器属性算是比较难理解的概念,下面就说说我对红宝书中例子的理解。
访问器属性顾名思义就是用于访问属性的属性,它必须使用Object.defineProperty()来定义。
var book={
_year: 2004;
edition: 1;
};
Object.defineProperty(book,"year",{
get: function(){
return _year;
}
set: function(newValue){
if(newValue>2004){
this._year=newValue;
this.edition+=newValue-2004;
}
}
});
book.year=2005;
alert(book.edition); //2
在上面的例子中,首先定义了一个book对象,包含两个数据属性_year和edition。然后用defineProperty()函数定义了一个访问器属性year,这个访问器属性拥有两个特性方法get和set,get返回数据属性_year的值,set设置_year和edition的值。然后通过调用访问器属性year设置_year和edition的值,最后alert出edition的值。
这就是上面例子的过程。主要要理解以下几点:
- 现在book中有三个属性:数据属性_year和edition,访问器属性year;
- _year前面的_是一种常用符号,表示只能通过对象方法访问的属性;
- set和get是访问器属性的特性,当通过访问器属性读取属性时会自动调用get设置的方法,当通过访问器属性写入属性时会自动调用set设置的方法;
- book.year=2005;就是利用访问器属性设置属性的值,会自动调用set定义的function;
- 这是访问器属性的常用方式,即通过设置一个属性的值会改变其他属性,我觉得这样可以使属性的变化具有动态性和相关性。
包含对书上内容的个人理解,欢迎拍砖指正!