1 回答

TA貢獻361條經驗 獲得超191個贊
首先,this是在創建的時候調用
? ? 先看new fn1(),就是對fn1創建了個實例,指向fn1.prototype,因此this.a=100,this.b=200中的this就是fn1.prototype,也就是fn1,因此
new?fn1().a=100; new?fn1().b=200;
? ? 接下來是return function(){};這么寫相當于將函數返回出去,相當于在全局作用域中創建一個function,當進行到return function這一步,這個函數里面的this已經是window了,不再是fn1;而.call(arguments[0])的意思是如果存在第一個參數,則將這個return的函數中的this綁定為第一個參數;
現在開始,
第一步,執行var a=new fn1().b,(第一個實例)
alert(this.a)是屬于return function中的,是在創建實例的過程中執行,而var a=new fn1().b;是實例創建好后,再去查找b的值,所以先執行alert(this.a);
因為沒有賦予參數,所以return function中的this就是window,因此alert(this.a)彈出300;new fn1().b為200,所以經過var a=new fn1().b后,
?window.a=200; ?new?fn1()={a:100,b:200}
第二步,執行new fn1(fn2()),參數是fn2(),因此call()方法將fn1()里面return的函數中的this綁定為fn2();因此創建實例(第二個實例)中的alert(this.a),就是alert(fn2().a),也就是alert(new fn1()),再次創建fn1實例(第三個實例),因為window.a是200,
因此創建實例中(第三個實例)的alert(this.a)彈出為200(步驟與第一步一樣);
第三個實例創建完畢,繼續執行第二個實例中alert(new fn1())中的這個alert;new fn1()就是{a:100,b:200},
因此彈出[object Object],其實內部就是{a:100,b:200},可用console.log查看;
彈完2個alert,實例(第二個實例)創建完成,
window.a=200; new?fn1()={a:100,b:200} v={a:100,b:200}
添加回答
舉報