fn2是fn實例化出來的一個對象,要瞭解new做了那些事情,先看一下一個普通對象有哪些東西。 普通對象: 實例化對象fn2: 1:普通對象的__proto__指向了Function.prototype而fn2的__proto__指向了fn.prototype,所以new的過程中改變了fn2的__pr ...
let obj = {}
let fn = function(){
this.content = 'zhangsan'
} let fn2 = new fn()
fn2是fn實例化出來的一個對象,要瞭解new做了那些事情,先看一下一個普通對象有哪些東西。
普通對象:
實例化對象fn2:
1:普通對象的__proto__指向了Function.prototype而fn2的__proto__指向了fn.prototype,所以new的過程中改變了fn2的__proto__的指向,讓其指向了fn的prototype。
2:fn2中有著fn中的content屬性,說明fn中的this指向了fn2,所以new的過程中經歷this指向的改變,並調用了fn方法給fn1添加content屬性。fn.call(fn1)。
完整過程:
let fn = function(){ this.content = 'zhangsan' } let fn2 = new fn() 過程: let fn2 = {} //創建出一個空對象 fn2.__proto__ = fn.prototype //改變fn2的__proto__指向 fn.call(fn2) //改變fn的this指向
實現一個自己的new:
let myNew = function(sup){ let obj = {} obj.__proto__ = sup.prototype sup.call(obj) return obj } let fn = function(){ this.content = 'zhangsan' } let fn2 = myNew(fn) console.log(fn2)