2015-12-04 3 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!" 
Смежные вопросы