Javascript: создание постоянно связанной функции - PullRequest
1 голос
/ 11 февраля 2011

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

Я создаю небольшое приложение с использованием Node.js, но у меня возникают проблемы с созданием объекта с функциями-прототипами, которые не потеряют свою привязку при передаче.

Вот что у меня есть:

foo.js

var Foo = module.exports = function(server) {
    this.server = server;
    // some other stuff
};

Foo.prototype.send = function(data) {
    server.doStuff(data);
};

Foo.prototype.sendData = function(data) {
    // do stuff with data;
    this.send(data);
};

bar.js

var Bar = module.exports = function() {
    this.dataStore = // data store connection;
};

Bar.prototype.getSomething(data, callback) {
    this.dataStore.get(data, function(err, response) {
        callback(response);
    });
};

main.js

var Foo = require('./foo');
var Bar = require('./bar');
var aFoo = new Foo(server);
var aBar = new Bar();

// at some point do:
aBar.getSomething(data, aFoo.sendData);

Как вы, вероятно, можете себе представить, передача этой функции aFoo.sendData для использования в качестве обратного вызова приводит к потере привязки к aFoo, поэтому она не может найти функцию 'send' в Foo.

Как бы я изменил Foo, чтобы sendData поддерживал его привязку к Foo? Есть ли лучший способ структурировать этот код так, чтобы в этом не было необходимости?

1 Ответ

1 голос
/ 11 февраля 2011

Вы просто заключаете вызов aFoo.sendData в анонимную функцию:

aBar.getSomething(data, function () {
    aFoo.sendData();
});

Поскольку ваша ссылка aFoo.sendData, ссылка на this внутри sendData больше не aFoo. При использовании анонимной функции вы не ссылаетесь на эту функцию; вы просто вызываете его как метод для экземпляра aFoo, поэтому this по-прежнему aFoo.

...