关键字new在调用构造函数的时候进行了如下几个步骤:
1.创建一个新对象
2.将构造函数的作用域赋值给新对象(新对象的proto 指向构造函数的 prototype,并且proto的constructor指向构造函数
3.将构造函数的this指向obj,这样obj就可以访问到构造函数中的属性
4.如果构造函数没有返回其他对象,那么返回 obj ,否则返回构造函数中返回的对象
function _new(){
let obj = {};
const Fn = [].shift.call(arguments);
obj.__proto__ = Fn.prototype;
let result = Fn.apply(obj, arguments);
return (typeof result === 'object' || typeof result === 'function') ? result : obj;
}
function A(str){
return function(){
console.log(str)
}
}
let a = _new(A, {a: 'hhhh'});
let b = new A({a: 'hhhh'});