new
一句话解释:
new
运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。
在JavaScript中调用new操作符的时候一共会进行四步操作:
- 创建一个空的JavaScript对象,
{}
- 将新对象的隐式原型属性
__proto__
指向构造函数的显示原型 - 修改this指向,将构造函数的this指向新创建的对象。也即通过this定义在构造函数中的属性都会被定义给新创建的对象。
- 查看构造函数的返回值,返回基本值则忽略,返回对象类型则执行
了解了new操作符进行了怎样的操作之后就可以手动模拟实现这样一个过程了。
function ourNew(context) {
//1.创建一个空对象
let obj = {}
//2.从参数中取出构造函数,arguments表示被传递给函数的所有参数组成的类数组
let constructor = [].shift.call(arguments)
//3.原型链的链接
obj.__proto__ = constructor.prototype
//4.将构造函数的this指向新创建的对象
let somethingReturn = constructor.apply(obj, arguments)
//5.返回新对象。查看构造函数是否有返回对象,有则返回该对象,无则返回新创建的对象
// return obj
return typeof somethingReturn === 'object' ? somethingReturn : obj
}