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