参考链接:

https://juejin.cn/post/6844903937405878280#comment

  • 创建一个新的对象
  • 继承父类原型上的方法.
  • 添加父类的属性到新的对象上并初始化. 保存方法的执行结果.
  • 如果执行结果有返回值并且是一个对象, 返回执行的结果, 否则, 返回新创建的对象。

实现

  1. function _new(obj, ...rest){
  2. // 基于obj的原型创建一个新的对象
  3. const newObj = Object.create(obj.prototype);
  4. // 添加属性到新创建的newObj上, 并获取obj函数执行的结果.
  5. const result = obj.apply(newObj, rest);
  6. // 如果执行结果有返回值并且是一个对象, 返回执行的结果, 否则, 返回新创建的对象
  7. return typeof result === 'object' ? result : newObj;
  8. }

测试:

  1. function Person(firtName, lastName) {
  2. this.firtName = firtName;
  3. this.lastName = lastName;
  4. }
  5. Person.prototype.getFullName = function () {
  6. return `${this.firtName} ${this.lastName}`;
  7. };
  8. const tb = new Person('Chen', 'Tianbao');
  9. console.log(tb);
  10. const tb2 = _new(Person, 'Chen', 'Tianbao');
  11. console.log(tb2)

注意:

这种对于new操作的实现只适用于es5,es6会报原型上的错误
image.png