【问题标题】:Possible to overwriting a method used in a callback?可以覆盖回调中使用的方法吗?
【发布时间】:2015-12-04 19:26:58
【问题描述】:

这可能吗?我试图在我的页面加载后覆盖一个 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 使用的定义,还是我运气不好?

【问题讨论】:

  • 它应该可以工作 - 向我们展示一个复制示例(jsfiddle 链接或堆栈 sn-p)。

标签: javascript callback closures


【解决方案1】:

您应该能够在您创建的对象上定义myMethod,它将覆盖原型myMethod。你写的应该可以工作,因为你不是直接引用 myMethod ,而是通过 a 对象。

以下对我有用

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!"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    相关资源
    最近更新 更多