1 回答

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