qq_ontomorrow_03681282
2016-10-10 10:29:32
function fn() {? ? this.a = 0;? ? this.b = function() {? ? ? ? alert(this.a)? ? }}fn.prototype = {? ? b: function() {? ? ? ? this.a = 20;? ? ? ? alert(this.a);? ? },? ? c: function() {? ? ? ? this.a = 30;? ? ? ? alert(this.a);? ? }}var myfn = new fn();myfn.b();myfn.c();
2 回答
已采納

stone310
TA貢獻361條經驗 獲得超191個贊
this是函數被調用的時候,函數被誰調用,this就指向誰;
var myfn=new fn()時,是創建了一個實例,然后實例this指向fn,然后_proto_屬性指向fn的prototype屬性;
因此當創建好實例,myfn實例上有a和b,(即fn里面的this.a和this.b);它的_proto_屬性(相當于fn的prototype屬性)上有b和c;(這里有2個b重名,如果調用b,會先查找實例上的,如果發現實例上沒有,再去沿著_proto_屬性去查找);
因此當執行myfn.b()時(這里在myfn上執行b函數,函數被myfn調用),
會先在myfn的實例上面去找b,這里它的實例上是有this.a和this.b,這里this指的就是myfn,因此執行b()
?this.b?=?function()?{ ????????alert(this.a)???//這里執行時函數是被myfn調用,因此this還是指向myfn ????}
所以就是alert(myfn.a)也就是alert(0);
當執行myfn.c()時(這里在myfn上執行 c函數,函數被myfn調用),
會先在myfn的實例上面去找c,這里它的實例上沒有c,于是在myfn的_proto_(即fn的prototype)屬性上去找c,執行c()
?c:?function()?{ ????????this.a?=?30;???????//被myfn調用,this指向myfn,a覆蓋原來的a; ????????alert(this.a);?????//被myfn調用,this指向myfn,this.a為30 ????}
所以alert(30)

JustWannaHugU
TA貢獻452條經驗 獲得超796個贊
this關鍵字代表當前的對象
所以你代碼中的this.a = 30;之類的代碼,就是調用這個方法的該對象,為其屬性賦值
同理,this.方法即代表調用當前對象的某個方法
添加回答
舉報
0/150
提交
取消