Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 29.01.2016, 14:04
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

GayCoder,
Не удобно разделять метод отписки и отписки от всего. Вы теряете гибкость.

куда проще так:
...removeEventListener()//удалили все обработчики
...removeEventListener(someType)//удалили все обработчики конкретного события
...removeEventListener(someType, handler)//удалили конкретный обработчик
Ответить с цитированием
  #12 (permalink)  
Старый 29.01.2016, 16:42
Аватар для GayCoder
Аспирант
Отправить личное сообщение для GayCoder Посмотреть профиль Найти все сообщения от GayCoder
 
Регистрация: 28.01.2016
Сообщений: 99

vanished

Последний раз редактировалось GayCoder, 02.08.2020 в 16:16.
Ответить с цитированием
  #13 (permalink)  
Старый 29.01.2016, 18:28
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Сообщение от GayCoder
if ({}.hasOwnProperty.call(this._listeners, event)) {
очень странно, а не проще так:
if (this._listeners.hasOwnProperty(event)) {

или
if (event in this._listeners) {

или
if (this._listeners[event]) {
Ответить с цитированием
  #14 (permalink)  
Старый 30.01.2016, 08:52
Аватар для GayCoder
Аспирант
Отправить личное сообщение для GayCoder Посмотреть профиль Найти все сообщения от GayCoder
 
Регистрация: 28.01.2016
Сообщений: 99

vanished

Последний раз редактировалось GayCoder, 02.08.2020 в 16:16.
Ответить с цитированием
  #15 (permalink)  
Старый 30.01.2016, 12:27
Аватар для GayCoder
Аспирант
Отправить личное сообщение для GayCoder Посмотреть профиль Найти все сообщения от GayCoder
 
Регистрация: 28.01.2016
Сообщений: 99

vanished

Последний раз редактировалось GayCoder, 02.08.2020 в 16:16.
Ответить с цитированием
  #16 (permalink)  
Старый 30.01.2016, 14:54
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

GayCoder,
Увы, но данная реализация вообще не верна и не имеет права на жизнь.
Дело в том что вы в подписке проверяете наличие этой функции в слушателе чего делать категорически нельзя. Допустим у меня есть 2 экземпляра одного класса, и оба подписываются на событие, если метод которым они подписываются лежит в прототипе, то первый подпишется нормально, а второй перетрет его scope (в вашей реализации). Я создал упрощённый макет чтобы продемонстрировать ошибку:

var EventEmiter = {
    _handlers: [],
    on: function (handler, context) {
        if (!this._hasHandler(handler)) {
            this._handlers.push({handler: handler, context: context});
        }
    },
    off: function (handler) {
        this._handlers.splice(this._handlers.indexOf(handler), 1);
    },
    emit: function () {
        this._handlers.slice().forEach(function (handlerData) {
            handlerData.handler.call(handlerData.context);
        });
    },
    _hasHandler: function (handler) {
        return this._handlers.some(function (handlerData) {
            return handlerData.handler === handler;
        });
    }
};

var SomeClass = function (name) {
    this._name = name;
};

SomeClass.prototype.onEvent = function () {
    console.log(this._name);
};

var vasia = new SomeClass('Вася');
var petia = new SomeClass('Петя');

EventEmiter.on(vasia.onEvent, vasia);
EventEmiter.on(petia.onEvent, petia);

EventEmiter.emit();


Как видите отработал только 1 обработчик. В данном случае функция которой они подписываются одна и та же, но она относится к абсолютно разным объектам.

Ну и в методе emit вы почему-то снова не скопировали массив обработчиков перед тем как вызывать события.

Последний раз редактировалось tsigel, 30.01.2016 в 14:59.
Ответить с цитированием
  #17 (permalink)  
Старый 30.01.2016, 17:50
Аватар для GayCoder
Аспирант
Отправить личное сообщение для GayCoder Посмотреть профиль Найти все сообщения от GayCoder
 
Регистрация: 28.01.2016
Сообщений: 99

vanished

Последний раз редактировалось GayCoder, 02.08.2020 в 16:16.
Ответить с цитированием
  #18 (permalink)  
Старый 30.01.2016, 17:58
Аватар для GayCoder
Аспирант
Отправить личное сообщение для GayCoder Посмотреть профиль Найти все сообщения от GayCoder
 
Регистрация: 28.01.2016
Сообщений: 99

vanished

Последний раз редактировалось GayCoder, 02.08.2020 в 16:16.
Ответить с цитированием
  #19 (permalink)  
Старый 30.01.2016, 18:38
Аватар для GayCoder
Аспирант
Отправить личное сообщение для GayCoder Посмотреть профиль Найти все сообщения от GayCoder
 
Регистрация: 28.01.2016
Сообщений: 99

vanished

Последний раз редактировалось GayCoder, 02.08.2020 в 16:16.
Ответить с цитированием
  #20 (permalink)  
Старый 30.01.2016, 21:01
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Сообщение от GayCoder
С тем примером правильно работает.
нет, это не правильная работа. В вашем примере в консоли должно быть 13 записей.

Точнее если Вы так и планировали, то может быть оно выполняется как надо, но в общем подходе это работает не так как это реализуют ведущие библиотеки и фреймворки. Это не удобная реализация, на которой не построить сложного приложения
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите пожалуйста как мне можно изменить этот скрипт Niko Общие вопросы Javascript 3 15.04.2013 15:35
javascript обфускатор или как правильно скрыть код syegorius Общие вопросы Javascript 1 19.09.2012 02:58
Аккордеон меню, как доработать код. Gawk Общие вопросы Javascript 1 23.07.2012 13:01
Как вывести переменную из javascript в html код? red-nicolas Элементы интерфейса 3 25.02.2012 13:27
Как узнать динамический код страницы? gosha13 Общие вопросы Javascript 5 27.07.2009 13:31