实现一个 new

参考 mdn

new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。new 关键字会进行如下的操作:

1.创建一个空的简单 JavaScript 对象(即{});

2.链接该对象(即设置该对象的构造函数)到另一个对象 ;( 通俗理解就是新对象隐式原型proto链接到构造函数显式原型 prototype 上。)

3.将步骤 1 新创建的对象作为 this 的上下文 ;( 实际是执行了构造函数 并将构造函数作用域指向新对象 )

4.如果该函数没有返回对象,则返回 this。( 实际是返回一个空对象, new Object()就是返回一个空对象{} )

1
function _new(constructor, ...arg) {
2
  var obj = {}; // 对应于上面的步骤 1
3
  obj.__proto__ = constructor.prototype; // 对应于上面的步骤 2
4
5
  var res = constructor.apply(obj, arg); // 对应于上面的步骤 3
6
7
  return Object.prototype.toString.call(res) === "[object Object]" ? res : obj; // 对应于上面的步骤 4
8
}
9
10
const Fun = function(name) {
11
  this.name = name;
12
};
13
14
console.log(_new(Fun, "小明"));
15
16
// Fun {name: "小明"}