亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

javascript面向對象題目

javascript面向對象題目

慕前端8664132 2016-09-09 01:02:32
?window.a=300;? ? function fn1(){? ? ? this.a=100;? ? ? this.b=200;? ? ? return function(){? ? ? ? alert(this.a);? ? ? }.call(arguments[0]);? ? }? ? function fn2(){? ? ? this.a=new fn1();? ? }? ? var a=new fn1().b;//300? ? ? ? //{a:100,b:200}.b? ? //a=200? ? var v=new fn1(fn2());? ? ? ? ? //200 [object Object]? ? //fn2(): a={a:100,b:200}? ? //v:{a:100,b:200}雙斜扛后面是輸出結果?為什么是這樣???js引擎到底怎么走的?
查看完整描述

1 回答

已采納
?
stone310

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}


查看完整回答
2 反對 回復 2016-09-09
  • 1 回答
  • 0 關注
  • 1854 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號