Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.11.2016, 18:26
Аватар для GayCoder
Аспирант
Отправить личное сообщение для GayCoder Посмотреть профиль Найти все сообщения от GayCoder
 
Регистрация: 28.01.2016
Сообщений: 99

EventEmitter (ES 6)
vanished

Последний раз редактировалось GayCoder, 02.08.2020 в 16:16.
Ответить с цитированием
  #2 (permalink)  
Старый 14.11.2016, 05:42
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

EventEmitter (ES 5)
(function () {

	function EventEmitter() {
		this._listeners = {};
		this.on = this.addListener;
		this.once = this.addListenerOnce;
		this.off = this.removeListener;
	}

	EventEmitter.prototype = {

		constructor: EventEmitter,

		addListener: function (type, fn, context) {
			return this._addListener(type, fn, context, false);
		},

		addListenerOnce: function (type, fn, context) {
			return this._addListener(type, fn, context, true);
		},

		removeListener: function (type, fn, context) {
			if (this._hasListeners(type)) {
				for (; ; ) {
					var index = this._indexOfListener(type, fn, context);
					if (index < 0) {
						break;
					}
					this._listeners[type].splice(index, 1);
				}
				if (!this._listeners[type].length) {
					delete this._listeners[type];
				}
			}
			return this;
		},

		removeAllListeners: function (type) {
			if (arguments.length) {
				delete this._listeners[type];
			} else {
				this._listeners = {};
			}
			return this;
		},

		emit: function (type, args) {
			args = [].slice.call(arguments, 1);
			if (this._hasListeners(type)) {
				var listeners = this._listeners[type];
				var i = 0;
				while (i < listeners.length) {
					var listener = listeners[i];
					listener.fn.apply(listener.context, args);
					if (listener.once) {
						listeners.splice(i, 1);
						continue;
					}
					++i;
				}
				if (!listeners.length) {
					delete this._listeners[type];
				}
			}
			return this;
		},

		_addListener: function (type, fn, context, once) {
			if (typeof fn !== 'function') {
				throw new TypeError('fn must be function');
			}
			context = context || this;
			if (!this._hasListeners(type)) {
				this._listeners[type] = [];
			}
			var listener = {
				fn,
				context,
				once
			};
			this._listeners[type].push(listener);
			return this;
		},

		_indexOfListener: function (type, fn, context) {
			context = context || this;
			var listeners = this._listeners[type];
			var length = listeners.length;
			for (var i = 0; i < length; ++i) {
				var listener = listeners[i];
				if (listener.fn === fn && listener.context === context) {
					return i;
				}
			}
			return -1;
		},

		_hasListeners: function (type) {
			return this._listeners.hasOwnProperty(type);
		}

	};

	function hello(name) {
		console.log(this);
		console.log('Hello ' + name + '!');
	}

	function hello2(name) {
		console.log('Привет, ' + name + '!');
	}

	function hello3(name) {
		console.log('Bonjour ' + name + '!');
	}

	var ee = new EventEmitter;
	ee.on('greeting', hello);
	ee.on('greeting', hello2);
	ee.once('greeting', hello3);
	ee.emit('greeting', 'Foo');
	ee.off('greeting', hello);
	ee.emit('greeting', 'Bar');

})();

GayCoder, где все преимущества ES6?

Последний раз редактировалось Rise, 14.11.2016 в 05:46.
Ответить с цитированием
  #3 (permalink)  
Старый 16.11.2016, 09:35
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Rise
где все преимущества ES6?
спросил человек, который не использовал синтаксис классов
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #4 (permalink)  
Старый 16.11.2016, 18:43
Аватар для GayCoder
Аспирант
Отправить личное сообщение для GayCoder Посмотреть профиль Найти все сообщения от GayCoder
 
Регистрация: 28.01.2016
Сообщений: 99

vanished

Последний раз редактировалось GayCoder, 02.08.2020 в 16:16.
Ответить с цитированием
  #5 (permalink)  
Старый 17.11.2016, 08:55
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

GayCoder, в данном случае extends не используется зачем писать о его удобстве, либо используйте его раз он так удобен... просто забыть о прототипах сомнительное преимущество они там как были так и остались...
Ответить с цитированием
  #6 (permalink)  
Старый 17.11.2016, 11:50
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Сообщение от nerv_ Посмотреть сообщение
спросил человек, который не использовал синтаксис классов
Дык он на ES5 переделал жи.
Впрочем классы ES6 меня бесят. Отсутствие (официальное) статических свойств и убогий "супер" чего только стоят.
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 17.11.2016, 15:49
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Aetae
Дык он на ES5 переделал жи.
это я проглядел

Сообщение от Aetae
Впрочем классы ES6 меня бесят
меня тоже вначале бесили, а потом смирился. Это лучше, чем ничего
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #8 (permalink)  
Старый 17.11.2016, 16:05
Аватар для GayCoder
Аспирант
Отправить личное сообщение для GayCoder Посмотреть профиль Найти все сообщения от GayCoder
 
Регистрация: 28.01.2016
Сообщений: 99

vanished

Последний раз редактировалось GayCoder, 02.08.2020 в 16:16.
Ответить с цитированием
  #9 (permalink)  
Старый 17.11.2016, 16:26
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

GayCoder, сеттеры и геттеры - это сеттеры и геттеры. Оверхед.
__________________
29375, 35
Ответить с цитированием
  #10 (permalink)  
Старый 17.11.2016, 17:04
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

GayCoder, они были и раньше
function SetterGetter(initialX) {
	this.x = initialX;
}

SetterGetter.prototype = {

	constructor: SetterGetter,

	set x(v) {
		console.log('Set x: ' + v);
		this._x = v;
		return v;
	},

	get x() {
		return this._x;
	}

};

new SetterGetter(42); // prints "Set x: 42"
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
dgram и eventEmitter reeiit Node.JS 0 06.06.2016 02:11
Можно ли в Redux использовать EventEmitter? yazonnile Общие вопросы Javascript 7 06.04.2016 22:51
Голосуем за приватные свойства в кофескрипте Mаxmaxmаximus Оффтопик 20 07.02.2016 23:58
Как бы вы переписали этот код GayCoder Общие вопросы Javascript 23 01.02.2016 08:19
EventEmitter cyber Оффтопик 19 02.02.2014 18:32