我们首先知道new做了什么:
- 创建一个空的简单JavaScript对象(即{});
- 链接该对象(即设置该对象的构造函数)到另一个对象 ;
- 将步骤(1)新创建的对象作为this的上下文 ;
- 如果该函数没有返回对象,则返回this。
- 知道new做了什么,接下来我们就来实现它
function create(Con, ...args){
// 创建一个空的对象
this.obj = {};
// 将空对象指向构造函数的原型链
Object.setPrototypeOf(this.obj, Con.prototype);
// obj绑定到构造函数上,便可以访问构造函数中的属性,即this.obj.Con(args)
let result = Con.apply(this.obj, args);
// 如果返回的result是一个对象则返回
// new方法失效,否则返回obj
return result instanceof Object ? result : this.obj;
}
function news(fn, ...args) {
let instance = Object.create(fn.prototype)
let res = fn.apply(instance, args)
return typeof res === 'object' ? res : instance
}