Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   вызов метода объявленного через prototype из другого метода (того же объекта) (https://javascript.ru/forum/misc/72603-vyzov-metoda-obyavlennogo-cherez-prototype-iz-drugogo-metoda-togo-zhe-obekta.html)

Герасим 11.02.2018 22:40

вызов метода объявленного через 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 в этом случае?

рони 11.02.2018 23:10

Герасим,
что-то вы не договариваите ...
<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>

Герасим 12.02.2018 14:19

Помогите разобраться пожалуйста. Открываю то что есть.
файл 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 нет, и возникает ошибка.
Значит надо как-то передать контекст.
Как это сделать?

Nexus 12.02.2018 14:33

Цитата:

Сообщение от Герасим
Значит надо как-то передать контекст.
Как это сделать?

https://learn.javascript.ru/call-apply

Герасим 12.02.2018 14:43

Я сделал так, кроме функции 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:59.