m1ralx / javascript-tasks-5

Задача к лекции «This / Bind / Call / Apply» – «Пора на лекцию»

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Задача к лекции «This / Bind / Call / Apply» – «Пора на лекцию»

🆘 Как создать Pull Request
⚠️ При создании PullRequest'а не забудьте указать ваши имя и фамилию.

Общие требования

Мы очень хотим, чтобы код вы написали сами, а не пользовались внешними библиотеками.

Прежде чем отправлять решение, проверьте его на соответствие общим требованиям.

Когда вы создадите или обновите пулл-реквест, он автоматически будет проверен на соответствие кодстайлу и базовую работоспособность. Результаты вы увидите внизу:

Если всё хорошо:
2015-10-08_1845

Если всё плохо:
2015-10-08_1841

Проверить можно и вручную:

// Устанавливаем проверяльщик
npm install

// Проверяем
npm test

// В результате выведутся ошибки, если они есть
// Если какие-либо ошибки будут непонятны – смело спрашиваем у ментора

Задача

От вечеринок и мальчишников возвращаемся в мрачные стены университета ­— время слушать лекцию.

В файле index.js вас ждут студенты, готовые внимать каждому слову преподавателя:

var daria = {
    focus: 5
};

lecturer.on('begin', daria, function () {
    this.focus += 1;
});

Студента можно подписать на событие, производимое преподавателем (например, начало лекции или показ нового слайда) — то есть указать, какая функция должна быть вызвана при наступлении этого события.

Ваша задача — реализовать несколько методов:

  • подписка на событие — on
  • отписка от события — off
  • вызов события — emit
var getEmitter = require('./emitter');
var lecturer = getEmitter();

// подписываем студента daria на событие slide
lecturer.on('slide', daria, function () {
    console.log('Новый слайд!');
});

// вызываем событие slide
lecturer.emit('slide'); // 'Новый слайд!'

// отписываем студента daria от события slide
lecturer.off('slide', daria);

// вызываем событие slide
lecturer.emit('slide'); // обработчик не выполнился

Чтобы задания не казалось совсем простым, вам также нужно реализовать поддержку пространства имён.

lecturer.on('slide', daria, function () {
    console.log('Новый слайд!');
});

lecturer.on('slide.funny', daria, function () {
    console.log('Новый смешной слайд!');
});

lecturer.emit('slide'); // 'Новый слайд!'

lecturer.emit('slide.funny'); // 'Новый смешной слайд!'
                              // 'Новый слайд!'

lecturer.emit('slide.text'); // 'Новый слайд!'

Подробности вас ждут в файле index.js.

Необязательное задание

Необходимо реализовать два дополнительных метода эмиттера. Оба метода работают аналогично on, но обладают некоторыми особенностями.

several — вызывает обработчик события n раз

lecturer.several('slide', daria, function () {
    console.log('Новый слайд!');
}, 2); // обработчик должен выполнится только дважды

lecturer.emit('slide'); // 'Новый слайд!'
lecturer.emit('slide'); // 'Новый слайд!'
lecturer.emit('slide'); // обработчик не выполнился

through — вызывает обработчик события каждый n-й раз

lecturer.through('slide', daria, function () {
    console.log('Новый слайд!');
}, 2); // обработчик должен выполниться на второй, четвёртый, шестой (и так далее) раз

lecturer.emit('slide'); // обработчик не выполнился
lecturer.emit('slide'); // обработчик не выполнился
lecturer.emit('slide'); // 'Новый слайд!'
lecturer.emit('slide'); // обработчик не выполнился
lecturer.emit('slide'); // обработчик не выполнился
lecturer.emit('slide'); // 'Новый слайд!'

About

Задача к лекции «This / Bind / Call / Apply» – «Пора на лекцию»


Languages

Language:JavaScript 100.0%