new
运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。
参数:
constructor
一个指定对象实例的类型的类或函数。arguments
一个用于被constructor
调用的参数列表。
new
关键字会进行如下的操作:
- 创建一个空的简单
JavaScript
对象(即{}
); - 为步骤 1 新创建的对象添加属性
__proto__
,将该属性链接至构造函数的原型对象(设置它的原型为构造函数的原型对象); - 将步骤 1 新创建的对象作为
this
的上下文; - 如果该函数没有返回对象,则返回
this
。
手撕代码
const \_new = function () {
// 补全代码
// 1. 创建一个空的简单 `JavaScript` 对象(即 `{}`);
// 2. 为步骤 1 新创建的对象添加属性 `\_\_proto\_\_`,将该属性链接至构造函数的原型对象(设置它的原型为构造函数的原型对象);
// 3. 将步骤 1 新创建的对象作为 `this` 的上下文;
// 4. 如果该函数没有返回对象,则返回 `this`。
const obj1 = {}; // 1
const Fn = arguments[0]; // 获取函数参数
Object.setPrototypeOf(obj1, Fn.prototype); // 2
const obj2 = Fn.apply(obj1, [].slice.call(arguments, 1)) // 3
return obj2 instanceof Object ? obj2 : obj1; // 4
}
[].slice.call(arguments, 1)
的作用是获得一个arguments
的拷贝数组,且该数组不含arguments
的第一个元素。