вызов метода объявленного через prototype из другого метода (того же объекта)
Здравствуйте!
//объявление объекта
var TSwitchClient = function () {
this.stage = '';//состояние
}
//Метод DRAW Отрисовка компонента в контейнере
TSwitchClient.prototype.draw = function () {
console.log('TSwitchClient.prototype.draw');
}
//Метод Subscribe.
//Вызывается источником данных. Принимает новое состояние.
TSwitchClient.prototype.subcribe = function (stage) {
console.log('TSwitchClient.prototype.subcriber', stage);
this.stage = stage;
this.draw();//отрисовка
}
При вызове this.draw(); получаю ошибку TypeError: this.draw is not a function at Array.TSwitchClient.subcribe Естественно, объект к которому обращаюсь заранее (выше по коду) создан SwDataClient = new TSwitchClient(); Как из метода subcribe вызвать метод draw в этом случае? |
Герасим,
что-то вы не договариваите ...
<script>
//объявление объекта
var TSwitchClient = function () {
this.stage = '';//состояние
}
//Метод DRAW Отрисовка компонента в контейнере
TSwitchClient.prototype.draw = function () {
console.log('TSwitchClient.prototype.draw', this.stage);
}
//Метод Subscribe.
//Вызывается источником данных. Принимает новое состояние.
TSwitchClient.prototype.subcribe = function (stage) {
console.log('TSwitchClient.prototype.subcriber', stage);
this.stage = stage;
this.draw();//отрисовка
}
var SwDataClient = new TSwitchClient();
SwDataClient.subcribe(1)
</script>
|
Помогите разобраться пожалуйста. Открываю то что есть.
файл index.html
<script>
var SWDataSource = null;//Источник данных
var SwDataClient = null;//Потребитель данных
window.onload = function() {
console.log('Документ и все ресурсы загружены');//!! и это сообщение я получаю!
//создаю объект Источник данных
SWDataSource = new TSwitchDataSource();
//создаю объект Потребитель данных
SwDataClient = new TSwitchClient();
SwDataClient.draw();//так и есть вызывается draw, вижу его вывод в консоли
//прикреплю его к источнику данных
SWDataSource.addSubscriber(SwDataClient.subcribe);//
//в которой происходит this.subcribers.push(func);
};
потом в Источнике данных идёт вызов
TSwitchDataSource.prototype.sendStageToSubscribers = function () {
....................
this.subcribers[i](this.stage);//
Тут и теряется контекст. в итоге функция subcribe выполняется (так как она запихнута в массив вызовов) но когда в ней доходит до вызова this.draw; то так как корректного контекста this нет, и возникает ошибка. Значит надо как-то передать контекст. Как это сделать? |
Цитата:
|
Я сделал так, кроме функции func, сохраняю ещё объект к которому она относится self.
TSwitchDataSource.prototype.addSubscriber = function (self, func) {
this.subcribers.push({self, func});
}
...............
SWDataSource.addSubscriber(SwDataClient, SwDataClient.subcribe);//
И вызов теперь выглядит так:
//Рассылка изменений подписчикам
TSwitchDataSource.prototype.sendStageToSubscribers = function () {
var i = this.subcribers.length;
while (i !=0 ){
i--;
this.subcribers[i].func.call(this.subcribers[i].self, this.stage);
}
}
Выглядит сложно, но работает!!! спасибо. Как было бы красивее с точки зрения профи JS организовать этот код? |
| Часовой пояс GMT +3, время: 01:29. |