回调动态对象

时间:2011-01-26 09:37:04

标签: javascript dynamic callback

this.a = new A()
this.b = new B()

// point b callback to a member of object a
this.b.setCallback(this.a.mycallback)

// initiate callback
this.b.doCallback() // calls this.a->mycallback()

// ..... later on
// replace this.a with a new object
this.a = new A()

// callback is broken now?
this.b.doCallback()

如何将this.a的回调方法指向this.a的成员,无论this.a是否被新实例替换?换句话说,它是动态解决的吗?

我知道如何在其他语言中执行此操作但由于某些原因在Javascript中我似乎无法弄明白。

[编辑]

问题似乎有所不同。回调函数已在对象的原型中声明。但现在我已经把我认为的问题弄清楚了。

下面你会看到我对象的一段代码。它包含2个成员对象。一个玩家和一个波形。播放器是在新URL可用后动态实例化的内容。我希望波形对this.player的成员进行回调,名为“seek”,即使在对象发生变化之后也是如此。

这似乎不起作用:

//  placeholder, object is instantiated later
    this.player = {}

    var self = this

    this.waveform = new Waveform(this.waveformDiv, {
        seek : self.player.seek,
    })
    // after this point this.player can be instantiated multiple times with 
    // different Player objects. I want the callback to seek to point to the new instance.

... 但是一旦我使用匿名函数设置了搜索选项,它就可以工作了:

seek : function(time){ self.player.seek(time)},

我想理解为什么这两种方法根本不同。

2 个答案:

答案 0 :(得分:1)

将mycallback添加到A的原型中。

A.prototype.mycallback = function(...){...};

在此之后,任何A的实例都会有mycallback。

答案 1 :(得分:0)

我想我现在可以回答我自己的问题了。

seek : self.player.seek 

这会创建对玩家对象方法搜索的直接引用。因为它是对特定实例方法的引用,所以只要将播放器替换为其他实例,它就会中断。内存中的玩家位置会发生变化,其成员功能位置也会发生变化。

seek : function(time){ self.player.seek(time)}

这次创建了一个函数,并且seek保存了对该函数的引用。这不直接链接到播放器实例。调用seek时,将执行该函数,并在每次调用时评估函数中的变量。因此,当函数执行self.player时,会查找并指向正确/新的播放器对象。