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