new 其实只是一个语法糖步骤如下:
1、创建一个空对象,和一个函数。
const obj = {};
function fn(){
this.fnName = 'fn'
};
2、把空对象的原型设置成函数fn的原型对象。
Object.setPrototypeOf(obj,fn.prototype);
或者obj.__proto__ = fn.prototype;
这个时候得到的是一个对象,对象原型===函数fn的原型;
但是这个时候fn方法还没有执行,this.fnName = 'fn';这里没有对obj对象新增属性,所以obj还是一个空对象。
3、把fn函数的this指向修改为obj对象,并触发该函数。
fn.apply(obj);
或者fn.call(obj);
这里执行fn并且修改函数this指向其实等价于,obj.name = ‘name’。就是给obj新增属性罢了。
最后我们得到的就是一个 构造函数了。
最后完善一下
function fn(count){
this.count = count;
return {count}
};
console.log(new fn(1)) // {count:1}
function newFn(f,v){
const obj = {};
Object.setPrototypeOf(obj,f.prototype);
const res = f.call(obj,v);
return res instanceof Object ? res : obj;
}
console.log(newFn(fn,1)) // {count:1}
console.log(newFn(function fn2(count){this.count = count},1)) // fn2 {count:1}