通俗來說,我們都知道new一般做了下面四件事:
1、創建一個空對象;
2、將空對象的原型,指向於構造函數的原型;
3、將空對象作為構造函數的上下文(改變this指向);
4、對有返回值的構造函數做判斷處理
我們詳細來分析這四個點:
1、創建一個空對象
這個其實就在內存中開辟一個新的空間,創建一個新的對象。若直接打印一個new對象的話可以看到返回的是一個空對象。
2、將空對象的原型,指向於構造函數的原型
將空對象的__proto__指向Foo的原型Foo.prototype,這兩個做 == 判斷的話會返回true。
3、將空對象作為構造函數的上下文(改變this指向)
若直接執行構造函數的話,此時內部的this指向的是window,因為是全局下。
4、對有返回值的構造函數做判斷處理
如果構造函數有返回值,return的是一個基本類型,則對new,沒有影響
但是,如果返回的是一個引用類型(數組同理),則new就不起作用了
手寫new:
//定義構造函數 function Fun(age, name) { this.age = age this.name = name return 1 } function myNew(fn, ...args) { //1、先創造空對象 //其實等於var obj = Object.create({}) var obj = {} //2、obj的__proto__指向原型 Object.setPrototypeOf(obj, fn.prototype) //3、改變this指向,執行構造函數內部函數 var result = fn.apply(obj, args) //4、判斷return return result instanceof Object ? result : obj }