JavaScript中的对象分类
- 宿主对象(host Objects):由 JavaScript 宿主环境提供的对象,它们的行为完全由宿主环境决定。
- 内置对象(Built-in Objects):由 JavaScript 语言提供的对象。
- 固有对象(Intrinsic Objects ):由标准规定,随着 JavaScript 运行时创建而自动创建的对象实例。
- 原生对象(Native Objects):可以由用户通过 Array、RegExp 等内置构造器或者特殊语法创建的对象。
- 普通对象(Ordinary Objects):由{}语法、Object 构造器或者 class 关键字定义类创建的对象,它能够被原型继承。
函数对象与构造器对象
JavaScript中使用对象来模拟函数与构造器。JavaScript 为这一类对象预留了私有字段机制,并规定了抽象的函数对象与构造器对象的概念。
函数对象的定义是:具有 [[call]] 私有字段的对象,构造器对象的定义是:具有私有字段 [[construct]] 的对象。我们可以这样说,任何对象只需要实现 [[call]],它就是一个函数对象,可以去作为函数被调用。而如果它能实现 [[construct]],它就是一个构造器对象,可以作为构造器被调用。
程序员使用function关键字创建出来的对象同时拥有[[call]]、[[construct]]属性,所以既可以被当做函数调用也可以当做构造器,只不过它们的行为总是相似的。当返回值为对象时函数对象与构造器对象的作用是相同的。当作为构造器对象使用时过程如下:
- 以 Object.protoype 为原型创建一个新对象;
- 以新对象为 this,执行函数的 [[call]];
- 如果 [[call]] 的返回值是对象,那么,返回这个对象,否则返回第一步创建的新对象。
es6中的=>函数只能被当做函数调用。