# 解题思路 or 实现原理

new关键字做了哪些事?

  • 创建一个 新对象

  • 将构造函数的作用域赋值给这个新对象 -> this 指向这个 新对象

  • 执行构造函数中的代码 -> 为 新对象 添加属性

  • 返回 新对象

# 实现代码

/*
 * @Author: Rainy
 * @Date: 2019-11-14 19:25:01
 * @LastEditors: Rainy
 * @LastEditTime: 2022-01-24 11:37:39
 */

export function _new(...arg: any): any {
  // Eg: class Person {} or function Person() {}
  // Person.prototype
  // Person.prototype.constructor === Person
  // person = new Person => person.__proto__ === Person.prototype

  // Array.prototype.shift.call(arg) => [...arg].shift()

  // 1
  // let obj: any = new Object();
  // 2
  // obj.__proto__ = _constructor.prototype;
  // 1 2
  const _constructor = Array.prototype.shift.call(arg);
  const obj = Object.create(_constructor.prototype);
  // 3
  const result = _constructor.apply(obj, arg);
  // 4
  return typeof result === 'object' && result !== null ? result : obj;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27