new 发生了什么

  1. 创建一个空的对象
  2. 链接该对象(设置该对象的constructor)到另一个对象
  3. 将步骤1新创建的对象作为this的上下文 ;
  4. 如果该函数没有返回对象,则返回this。

实现

1
2
3
4
5
6
7
8
9
10
11
12
function createNew(){
// 实现第一步
var obj = {};
var args = Array.from(arguments)
var fun = args.shift();
// 实现第二步
obj.__proto__ = fun.prototype;
// 实现第三步
var res = fun.apply(obj,args);
// 实现第四步
return !!res &&(typeof res === "object" || typeof res === "function") ? res : obj
}

我在 MDN 文档上的是 Returns this if the function doesn’t return an object.
于是我试图以下的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 返回 Function
function Person(name,age){
this.name = name;
this.age = age;
return function sayHi(){
console.log('hi')
}
}
var tom = new Person("tom",5)
// 返回 Array
function Fruit(name){
this.name = name;
return [name]
}
var apple = new Fruit("apple")

发现tom、apple 分别返回了 sayHi、 [“apple”],因此第四步的对象指的是 Javascript 中除了数字、布尔值、字符串、null 和 undefined 这些类型之外的对象。即 Object、Function、Array 这三种。
所以要注意 typeof null 的结果是 “object”