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)},
我想理解为什么这两种方法根本不同。
答案 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时,会查找并指向正确/新的播放器对象。