樓下說的不要說的太隱晦嘛,大聲告訴大家,在function Window(){}中調(diào)用widget構(gòu)造函數(shù)
function Window(){widget.Widget.call(this);} ,這樣就把handlers屬性綁定在構(gòu)造的對象中,根據(jù)原型鏈的訪問順序,原型上的handlers就相當(dāng)于被重載了。這樣每次單擊a的時候(也就是new win的時候)都會重新生成一個handlers!恩 沒錯 就是這樣
function Window(){widget.Widget.call(this);} ,這樣就把handlers屬性綁定在構(gòu)造的對象中,根據(jù)原型鏈的訪問順序,原型上的handlers就相當(dāng)于被重載了。這樣每次單擊a的時候(也就是new win的時候)都會重新生成一個handlers!恩 沒錯 就是這樣
2017-05-10
按照J高程上說的方法,可以在Window類的構(gòu)造函數(shù)內(nèi),調(diào)用Widget構(gòu)造函數(shù),這樣“this.handlers = {};”執(zhí)行下來就會給Window類實例增加一個屬性handlers,而且是這個實例獨有的,不是共享的。而Widget的pototype里的方法,還是照舊extend到Window的prototype里,每個實例共享這些方法。這樣就不會出現(xiàn)handlers內(nèi)事件翻倍的問題了
2017-04-09
Window從Widget繼承來的on方法和fire方法和handlers屬性都放在了Window.prototype里,也就是說Window類的實例全部共享on方法、fire方法,和handlers屬性。評論里說的清空handlers屬性只能解決一部分問題,但是只要頁面里有多個,或者有過多個Window類的實例,就會存在handlers內(nèi)保存的數(shù)據(jù)有問題的情況?!禞avascript高級程序設(shè)計》里有講到這個問題,我看到的比較合理的解決辦法叫做“組合繼承”,在6.3.3章節(jié)。
2017-04-09
最贊回答 / 作死的花生醬
on、fire都是window對象的方法。this指向什么,要根據(jù)上下文來判斷,this指向的東西并不是不變的。調(diào)用on方法的時候,按當(dāng)時的上下文,this指向的是window對象??梢灾苯觮his.on這么調(diào)用。到了要使用fire方法的時候,是在click(function(){ ?…… ?})里邊了,一個作為參數(shù)的無名函數(shù)里邊。在這個函數(shù)里,this指向的不是window,所以你沒法直接this.fire這樣調(diào)用。
2017-04-03