new 关键字的工作步骤
- 创建一个新的对象 obj
- 将对象与构建函数通过原型链连接起来
- 将构建函数中的 this 绑定到新建的对象 obj上根据构建函数返回类型作判断,如果是原始值则被忽略,如果是返回对象,需要正常处理
const recodeNew = function (Func, ...args) { // 获取函数对象原型 const obj = {} obj.__proto__ = Func.prototype // 绑定到新对象上执行 const result = Func.apply(obj, args) // 判断 返回对象类型 return result instanceof Object ? result : obj } // 以下是测试代码 function Person(name, age) { this.name = name this.age = age } Person.prototype.print = function () { console.log({"姓名": this.name, "年龄": this.age}) } let p = recodeNew(Person, "小明", 18) console.log(p) p.print()