可以覆盖回调中使用的方法吗?

时间:2015-12-04 19:26:58

标签: javascript callback closures

这可能吗?我的页面加载后,我试图覆盖一个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指向的定义?如果是这种情况,我可以做些什么来改变$(".preview-template")使用的定义,还是我不幸运?

1 个答案:

答案 0 :(得分: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!"