一、JavaScript对象的分类
-
宿主对象(host Objects):由 JavaScript 宿主环境提供的对象,它们的行为完全由宿主环境决定。
-
内置对象(Built-in Objects):由 JavaScript 语言提供的对象。
- 固有对象(Intrinsic Objects ):由标准规定,随着 JavaScript 运行时创建而自动创建的对象实例。
- 原生对象(Native Objects):可以由用户通过 Array、RegExp 等内置构造器或者特殊语法创建的对象。
- 普通对象(Ordinary Objects):由{}语法、Object 构造器或者 class 关键字定义类创建的对象,它能够被原型继承。
1、宿主对象(host Objects)
宿主对象也分为固有的和用户可创建的两种,比如 document.createElement 就可以创建一些 dom 对象。
宿主也会提供一些构造器,比如我们可以使用 new Image 来创建 img 元素,这些我们会在浏览器的 API 部分详细讲解。
2、内置对象·固有对象(Intrinsic Objects)
ECMA 标准为我们提供了一份固有对象表,里面含有 150+ 个固有对象。通过这个链接查看。
固有对象是由标准规定,随着 JavaScript 运行时创建而自动创建的对象实例。
固有对象在任何 JS 代码执行前就已经被创建出来了,它们类似基础库。“类”就是固有对象的一种。
2、内置对象·原生对象(Native Objects)
通过语言本身的构造器创建的对象称作原生对象。在 JavaScript 标准中,提供了 30 多个构造器。

通过这些构造器,用 new 运算创建新的对象,所以我们把这些对象称作原生对象。
几乎所有这些构造器的能力都是无法用纯 JavaScript 代码实现的,它们也无法用 class/extend 语法来继承。
- Error: [[ErrorData]]
- Boolean: [[BooleanData]]
- Number: [[NumberData]]
- Date: [[DateValue]]
- RegExp: [[RegExpMatcher]]
- Symbol: [[SymbolData]]
- Map: [[MapData]]
这些字段使得原型继承方法无法正常工作,所以,我们可以认为,所有这些原生对象都是为了特定能力或者性能,而设计出来的“特殊对象”。
二、用对象来模拟函数与构造器:函数对象与构造器对象
- 函数对象的定义是:具有 [[call]] 私有字段的对象
- 构造器对象的定义是:具有私有字段 [[construct]] 的对象。
[[call]] 私有字段必须是一个引擎中定义的函数,需要接受 this 值和调用参数,并且会产生域的切换。
而浏览器宿主环境中,提供的 Image 构造器,则根本不允许被作为函数调用。
console.log(new Image);
console.log(Image());//报错
基本类型(String、Number、Boolean),它们的构造器被当作函数调用,则产生类型转换的效果。
值得一提的是,在 ES6 之后 => 语法创建的函数仅仅是函数,它们无法被当作构造器使用,见以下代码:
new (a=>0)//error
对于用户使用 function 语法或者 Function 构造器创建的对象来说,[[call]] 和 [[construct]] 行为总是相似的,它们执行同一段代码。
function f(){
return 1;
}
var v=f();//把f作为一个函数调用
var o=new f();//把f作为构造器调用
[[construct]]的执行过程
- 以 Object.protoype 为原型创建一个新对象;
- 以新对象为 this,执行函数的 [[call]];
- 如果 [[call]]的返回值是对象,那么,返回这个对象,否则返回第一步创建的新对象。
function cls(){
this.a = 100;
return {
getValue:() => this.a
}
}
var o = new cls;
o.getValue(); //100
//a 在外面永远无法访问到
三、特殊行为的对象
-
Array:Array的length属性根据最大的下标自动发生变化。
-
Object.prototype:作为所有正常对象的默认原型,不能再给它设置原型了。
-
String:为了支持下标运算,String的正整数属性访问会去字符串里查找。
-
Arguments:arguments的非负整数型下标属性跟对应的变量联动。
-
模块的 namespace对象:特殊的地方非常多,跟一般对象完全不一样,尽量只用于 import 吧。
-
类型数组和数组缓冲区:跟内存块相关联,下标运算比较特殊。
-
bind 后的 function:跟原来的函数相关联。
*** 获取全部 JavaScript 固有对象
三个值:Infinity、NaN、undefined
九个函数:
- eval
- isFinite
- isNaN
- parseFloat
- parseInt
- decodeURI
- decodeURIComponent
- encodeURI
- encodeURIComponent
一些构造器:
Array、Date、RegExp、Promise、Proxy、Map、WeakMap、Set、WeapSet、Function、Boolean、String、Number、Symbol、Object、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError
URIError、ArrayBuffer、SharedArrayBuffer、DataView、Typed Array、Float32Array、Float64Array、Int8Array、Int16Array、Int32Array、UInt8Array、UInt16Array、UInt32Array、UInt8ClampedArray。
四个用于当作命名空间的对象:
- Atomics
- JSON
- Math
- Reflect