前言
- 对象是JS的基本数据类型;
- 对象也可看做是属性的无序集合,每个属性都是一个名/值对;
- 也可以把对象看成是字符串到值的映射;
- 对象除了可以自有的属性,还可以从一个称为原型的对象继承属性;对象的方法通常是继承的属性;
- JS对象是动态的——可以新增属性也可以删除属性;
- 内置对象:由ECMAScript规范定义的对象或类;
- 宿主对象:由JS解释器所嵌入的宿主环境定义的,如:HTMLElement对象;
- 自定义对象:由运行中的JS代码创建的对象;
- 自有属性:直接在对象中定义的属性;
- 继承属性:在对象的原型对象定义的属性;
6.1 创建对象
可通过对象直接量、关键字new和(ECMAScript 5)Object.create()函数来创建。
6.1.1 对象直接量
- 对象直接量:由若干名/值对组成的映射表,名/值对中间用冒号分隔,名/值对之间用逗号分隔,整个映射表用花括号括起来。
1 | var empty = {}; |
6.1.2 通过new创建对象
- new运算符创建并初始化一个新对象。关键字new后跟随一个函数调用。
- 这里的函数称做构造函数,构造函数用以初始化一个新创建的对象。
1
var o = new Object(); // 创建一个空对象,和{}一样;
除了这些内置构造函数,用自定义构造函数来初始化新对象也是常见的。见第9章。
6.1.3 原型
- 每个JS对象都和另一个对象相关联;“另一个”对象就是我们熟知的原型,每个对象都从原型继承属性。
- 通过对象直接量创建的对象都具同有一个原型对象,并可以通过Object.prototype获得对原型对象的引用。
- 通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值。
6.1.4 Object.create()
- Object.create():它创建一个新对象,其中第一个参数是这个对象的原型。第二个是可选参数,用以对对象的属性进行描述。
- Object.create()是一个静态函数,而不是提供给某个对象调用的方法。
1
var o1 = Object.create({x:1, y:2}); // Object.create()创建了一个新对象,并赋值给o1;o1继承了属性x和y;
6.2 属性的查询和设置
- JS通过点(.)或方括号([ ])运算符来获取属性的值。
- 运算符左侧:应当是一个表达式,它返回一个对象。
- 运算符右侧:
- 点(.):右侧必须是一个以属性名称命名的简单的标识符;
- 方括号([]):方括号内部必须是一个计算结果为字符串的表达式;
1 | var author = book.author; |
6.2.1 作为关联数组的对象
- object[“property”] => 关联数组:使用方括号和一个字符串,看起来很像数组,只是这个数组元素是通过字符串索引而不是数字索引。关联数组也称做散列、映射或字典;JS对象都是关联数组;
- 当通过点运算符访问对象的属性时,属性名用一个标识符来表示;标识符必须直接出现在JS程序中,它们不是数据类型,因此程序无法修改它们。
- 当通过方括号访问对象的属性时,属性名通过字符串来表示;字符串是数据类型,在程序运行时可以修改和创建它们。
1
2
3
4var addr = "";
for(i = 0; i < 4; i++){
addr += customer["address" + i] + '\n';
}
由于在写程序的时候不知道属性名称,因此无法通过点运算符来访问对象的属性;但可以使用方括号运算符,因为它使用字符串值(字符串值是动态的,可以在程序执行时更改),而不是标识符(标识符是静态的,必须写死在程序中),作为索引对属性进行访问。
6.2.2 属性的继承
JS对象具有“自有属性”(own property),也有一些属性是从原型对象继承而来的。
- 假设要查询对象o的属性x,如果o中不存在x,那么将会继续在o的原型对象中查询属性x;如果原型中也没有x,但这个原型对象也有原型,那么继续在这个原型对象的原型上执行查询,直到找到x或查询到下一个原型是null的对象为止。