new 关键字做了什么操作
- 首先创建一个空对象,这个对象将会作为执行构造函数之后返回的对象实例
- 使上面创建的空对象的原型(proto)执行构造函数的 prototype 属性
- 将这个空对象赋值给构造函数内部的this,并执行构造函数逻辑
- 根据构造函数执行逻辑,返回第一步创建的对象或者构造函数的显式返回值
代码实现
function newFunc(...args) {
// 取出 arguments 数组的第一个参数,即目标构造函数
const constructor = args.shift();
// 创建一个空对象继承构造函数的prototrype属性
const obj = Object.create(constructor.prototype);
// 执行构造函数,得到构造函数返回结果
const result = constructor.apply(obj, args); //注意使用apply使构造函数内的this指向obj
// 构造函数执行后,返回结果是对象类型,则直接将该结果返回,否则返回obj对象
return typeof result === "object" && result != null ? result : obj;
}
function Csss(name) {
console.log(name);
this.da = name;
}
let data = newFunc(Csss, "CHu");
console.log(data);