对象是 JavaScript 的数据类型。它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值,因此我们可以把它看成是从字符串到值的映射。对象是动态的,可以随时新增和删除自有属性。对象除了可以保持自有的属性,还可以从一个称为原型的对象继承属性,这种「原型式继承(prototypal inheritance)」是 JavaScript 的核心特征。
对象最常见的用法是创建(create)、设置(set)、查找(query)、删除(delete)、检测(test)和枚举(enumerate)它的属性。
属性包括名字和值。属性名可以是包含空字符串在内的任意字符串,但对象中不能存在两个同名的属性。值可以是任意 JavaScript 值,或者在 ECMAScript 5中可以是 getter
或 setter
函数。
除了名字和值之外,每个属性还有一些与之相关的值,称为「属性特性(property attribute)」:
- 可写(writable attribute),表明是否可以设置该属性的值。
- 可枚举(enumerable attribute),表明是否可以通过
for-in
循环返回该属性。
- 可配置(configurable attribute),表明是否可以删除或修改该属性。
在 ECMAScript 5之前,通过代码给对象创建的所有属性都是可写的、可枚举的和可配置的。在 ECMAScript 5中则可以对这些特性加以配置。
除了包含属性特性之外,每个对象还拥有三个相关的「对象特性(object attribute)」:
- 对象的类(class),是一个标识对象类型的字符串。
- 对象的原型(prototype),指向另外一个对象,本对象的属性继承自它的原型对象。
- 对象的扩展标记(extensible flag),指明了在 ECMAScript 5中是否可以向该对象添加新属性。
最后,用下面术语来对 JavaScript 的「三类对象」和「两类属性」进行区分:
- 内置对象(native object),是由 JavaScript 规范定义的对象或类。例如,数组、函数、日期和正则表达式都是内置对象。
- 宿主对象(host object),是由 JavaScript 解释器所嵌入的宿主环境(比如 Web 浏览器)定义的。客户端 JavaScript 中表示网页结构的 HTMLElement 对象均是宿主对象。
- 自定义对象(user-defined object),是由运行中的 JavaScript 代码创建的对象。
- 自有属性(own property),是直接在对象中定义的属性。
- 继承属性(inherited property),是在对象的原型对象中定义的属性。