Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.02.2018, 22:40
Интересующийся
Отправить личное сообщение для Герасим Посмотреть профиль Найти все сообщения от Герасим
 
Регистрация: 22.09.2017
Сообщений: 24

вызов метода объявленного через 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 в этом случае?
Ответить с цитированием
  #2 (permalink)  
Старый 11.02.2018, 23:10
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Герасим,
что-то вы не договариваите ...
<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>
Ответить с цитированием
  #3 (permalink)  
Старый 12.02.2018, 14:19
Интересующийся
Отправить личное сообщение для Герасим Посмотреть профиль Найти все сообщения от Герасим
 
Регистрация: 22.09.2017
Сообщений: 24

Помогите разобраться пожалуйста. Открываю то что есть.
файл 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 нет, и возникает ошибка.
Значит надо как-то передать контекст.
Как это сделать?
Ответить с цитированием
  #4 (permalink)  
Старый 12.02.2018, 14:33
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

Сообщение от Герасим
Значит надо как-то передать контекст.
Как это сделать?
https://learn.javascript.ru/call-apply
Ответить с цитированием
  #5 (permalink)  
Старый 12.02.2018, 14:43
Интересующийся
Отправить личное сообщение для Герасим Посмотреть профиль Найти все сообщения от Герасим
 
Регистрация: 22.09.2017
Сообщений: 24

Я сделал так, кроме функции 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 организовать этот код?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов метода внутри объекта feoalter7 Общие вопросы Javascript 4 01.07.2014 16:23
Вызов метода объекта niko42 Общие вопросы Javascript 4 19.05.2014 21:24
вызов ф-ции обработчика как метода объекта FanAizu Общие вопросы Javascript 5 23.08.2013 15:52
Вызов метода объекта. Armen Общие вопросы Javascript 5 05.07.2013 15:54
Вызов метода через setTimeout из самого себя leoHex Events/DOM/Window 2 18.04.2011 00:28