@色少3年前
03/19
16:20
new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型之一
实现new,首先就要知道 new 操作,里面到底做了些啥?
- 创建一个空对象,将它的引用赋给this,继承函数的原型。
- 通过 this 将属性和方法添加至这个对象
- 最后返回 this 指向的新对象,也就是实例(如果没有手动返回其他的对象)
实现方法
function myNew(Parent, ...args) {
// 创建一个空对象,基础父级的原型
let obj = Object.create(Parent.prototype)
// 把this对象和剩余参数给构造函数
let result = Parent.apply(obj, args)
// 最后返回对象
return typeof result === 'object' ? result : obj
}
// new构造函数的模拟实现
const _new = function(){
let obj = new Object();
let _constructor = [].shift.call(arguments);
// 使用中间函数来维护原型关系
const F = function(){};
F.prototype = _constructor.prototype;
obj = new F();
let res = _constructor.apply(obj,arguments);
return typeof res === 'object' ? res || obj : obj;
}
