вызов метода объявленного через 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:59. |