Обратный вызов к динамическим объектам - PullRequest
0 голосов
/ 26 января 2011
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.b указывал на член this.a независимо от того, заменяется ли this.a новым экземпляром? Другими словами, оно разрешается динамически?

Я знаю, как это сделать на других языках, но по какой-то причине в Javascript я не могу понять это.

[править]

Проблема, похоже, в чем-то другом. Функции обратного вызова уже были объявлены в прототипе объекта. Но теперь я выделил проблему, я думаю.

Ниже вы видите кусок кода из моего объекта. Он содержит 2 объекта-члена. Один игрок и одна форма волны. Плеер - это нечто, что создается динамически после появления нового URL. Я хочу, чтобы осциллограмма сделала обратный вызов с именем «seek» члену this.player даже после изменения объекта.

Это не похоже на работу:

//  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 ]

1 голос
/ 26 января 2011

Добавьте mycallback к прототипу A.

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

После этого у любого экземпляра A будет mycallback.

0 голосов
/ 27 января 2011

Я думаю, что могу ответить на свой вопрос сейчас.

seek : self.player.seek 

Это создает прямую ссылку на метод поиска объекта player. Поскольку это ссылка на конкретный метод экземпляра, он ломается, как только игрок заменяется другим экземпляром. Положение игрока в памяти меняется, как и расположение его функций-членов.

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

На этот раз функция создается, и функция search содержит ссылку на функцию. Это не связано с экземпляром игрока напрямую. Когда выполняется поиск, функция выполняется и переменные в функции оцениваются при каждом вызове. Поэтому, когда функция выполняется, self.player ищется и указывает на правильный / новый объект игрока.

...