2015-12-04 37 views
0

這可能嗎?我正在嘗試覆蓋我的頁面加載後的javascript方法。有問題的代碼類似於此:可能覆蓋回調中使用的方法嗎?

myObject = Backbone.ViewManager.BaseView.extend({ 
    myMethod: function() { 
     alert("in old method definition"); 
    }, 
    initialize: function() { 
     var a = this; 
     Our.Events.on("alertEvent", function(){ 
      a.myMethod(); 
     } 
    } 
); 

(該Backbone.ViewManager位只是一種方法使用了一個框架,在JavaScript中創建對象,並在這裏並不重要。)

注意事件回調上述定義方法initialize。我們在創建對象時立即初始化它們。

我的頁面加載後,我嘗試重新定義myMethod以警告不同的消息。但是當alertEvent啓動時,原始消息會出現在警報中。

我認爲這是因爲封閉,在初始化後重新定義myObject上的方法不會影響a指向的定義嗎?如果是這樣的話,有什麼我可以做的來改變a使用的定義,還是我運氣不好?

+0

以下作品它應該工作 - 給我們再現例如(的jsfiddle鏈接或堆棧段)。 –

回答

1

您應該能夠在您創建的對象上定義myMethod,該對象將覆蓋原型myMethod。你寫的東西應該可以工作,因爲你沒有直接引用myMethod,而是通過一個對象。

function ObjCstr(){} 
ObjCstr.prototype.myMethod = function(){ alert("Old Message"); }; 
ObjCstr.prototype.callMyMethod = function(){ 
    var a = this; 
    return function(){ a.myMethod(); }; 
}; 

var test = new ObjCstr(); 
var fakeListener = test.callMyMethod(); 

fakeListener(); // "OldMessage" 
test.myMethod = function(){ alert("Overridden!"); }; 
fakeListener(); // "Overridden!"