对象有如下几个特点。
对象具有唯一标识性:即使完全相同的两个对象,也并非同一个对象。
对象有状态:对象具有状态,同一对象可能处于不同状态之下。
对象具有行为:即对象的状态,可能因为它的行为产生变迁。
我们可以把对象分成几类。
1.宿主对象(host Objects):由 JavaScript 宿主环境提供的对象,它们的行为完全由宿 主环境决定。
2.内置对象(Built-in Objects):由 JavaScript 语言提供的对象。
(1)固有对象(Intrinsic Objects ):由标准规定,随着 JavaScript 运行时创建而自动创 建的对象实例。
(2)原生对象(Native Objects):可以由用户通过 Array、RegExp 等内置构造器或者特 殊语法创建的对象。
(3)普通对象(Ordinary Objects):由{}语法、Object 构造器或者 class 关键字定义类 创建的对象,它能够被原型继承
宿主对象
首先我们来看看宿主对象。
JavaScript 宿主对象千奇百怪,但是前端最熟悉的无疑是浏览器环境中的宿主了。 在浏览器环境中,我们都知道全局对象是 window,window 上又有很多属性,如 document。 实际上,这个全局对象 window 上的属性,一部分来自 JavaScript 语言,一部分来自浏览 器环境。 JavaScript 标准中规定了全局对象属性,w3c 的各种标准中规定了 Window 对象的其它属 性。宿主对象也分为固有的和用户可创建的两种,比如 document.createElement 就可以创建 一些 dom 对象。 宿主也会提供一些构造器,比如我们可以使用 new Image 来创建 img 元素
内置对象·固有对象
固有对象是由标准规定,随着 JavaScript 运行时创建而自动创建的对象 实例。 固有对象在任何 JS 代码执行前就已经被创建出来了,它们通常扮演者类似基础库的角色。 我们前面提到的“类”其实就是固有对象的一种。
内置对象·原生对象
我们把 JavaScript 中,能够通过语言本身的构造器创建的对象称作原生对象。在 JavaScript 标准中,提供了 30 多个构造器。按照我的理解,按照不同应用场景,我把原生 对象分成了以下几个种类。通过这些构造器,我们可以用 new 运算创建新的对象,所以我们把这些对象称作原生对象。几乎所有这些构造器的能力都是无法用纯 JavaScript 代码实现的,它们也无法用 class/extend 语法来继承。 这些构造器创建的对象多数使用了私有字段, 例如:
Error: [[ErrorData]]
Boolean: [[BooleanData]]
Number: [[NumberData]]
Date: [[DateValue]]
RegExp: [[RegExpMatcher]]
Symbol: [[SymbolData]]
Map: [[MapData]]
这些字段使得原型继承方法无法正常工作,所以,我们可以认为,所有这些原生对象都是为了特定能力或者性能,而设计出来的“特权对象
特殊行为的对象
除了上面介绍的对象之外,在固有对象和原生对象中,有一些对象的行为跟正常对象有很大 区别。 它们常见的下标运算(就是使用中括号或者点来做属性访问)或者设置原型跟普通对象不 同,这里简单总结一下。
Array:Array 的 length 属性根据最大的下标自动发生变化。
Object.prototype:作为所有正常对象的默认原型,不能再给它设置原型了。
String:为了支持下标运算,String 的正整数属性访问会去字符串里查找。
Arguments:arguments 的非负整数型下标属性跟对应的变量联动。
模块的 namespace 对象:特殊的地方非常多,跟一般对象完全不一样,尽量只用于 import 吧。
类型数组和数组缓冲区:跟内存块相关联,下标运算比较特殊。
bind 后的 function:跟原来的函数相关联。