要想知道new操作符的原理,就得先了解new的作用是什么,我们都知道,一般将我们的构造函数实例化为对象时就要使用new操作符。
要想真正掌握并手写一个new,你需要掌握以下知识点:原型与原型链以及this绑定相关知识。
其实new的内部流程十分简单,大概就是这么几个步骤:
- 创建一个新的对象obj
- 将对象的隐式原型指向构造函数的原型对象
- 通过apply调用构造函数(改变this指向到obj)
- 返回obj,如果构造函数有返回值还需判断,如果返回值为引用类型则返回引用类型对象,如果为原始类型就返回obj
手写:
function MyNew() {
// 获取到形参列表,拿到构造函数以及对应参数
let [ArgFun, ...arg] = [...arguments]
// 定义一个空的对象
let obj = {};
// 原型指向
obj.__proto__ = ArgFun.prototype;
// 设置this指向
let tartgetObj = ArgFun.apply(obj, arg)
// 通过apply调用构造函数(改变this指向到obj)
return tartgetObj instanceof Object == true ? tartgetObj : obj
}
使用:
function Person(name, age) {
this.name = name;
this.age = age;
console.log('执行')
return '12'
}
let zhangsan = MyNew(Person, '张三', 12)
console.log(zhangsan)