Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.03.2015, 15:52
Новичок на форуме
Отправить личное сообщение для Ivan_Ivanoff_24 Посмотреть профиль Найти все сообщения от Ivan_Ivanoff_24
 
Регистрация: 14.03.2015
Сообщений: 6

Задачка на понимание ООП
Всем доброго времени суток!

Читая и осваивая JavaScript, конкретно, ООП-раздел, наткнулся на короткую, но пока неподъёмную для меня задачку.

"В системе имеется некоторое число объектов, которые сообщаются между собой с помощью событий.
Написать на native JavaScript класс, который будет предоставлять им эту возможность.
Реализовать на примере."


Для себя я понял эту задачу так - нужно создать класс, который будет неким связующим звеном между объектами системы, с помощью которого они смогут отправлять и принимать данные друг от друга.

Предварительные идеи - при создании нового объекта (объекты одного класса) на этапе конструктора записывать новый объект в массив объектов (изначально он будет пуст). Далее по логике каждый объект должен иметь методы наподобие SendMessage (здесь можно разбить на варианты SendToOne И SendToAll - то есть либо всем объектам массива либо конкретному) и ReceiveMessage - получение сообщения от объектов.

Но есть вопросы по реализации - как реализовать получение и отсылку сообщений? То есть чтобы объект знал, от кого ему пришло сообщение, сохранял его у себя в каком-то свойстве и мы могли бы извлечь эти данные. Ну и не всё понятно с механизмом отправки.

Буду благодарен за любые идеи и рекомендации. Готового кода не прошу, просто опишите, как вы видите решение такой задачи.

Благодарю!
Ответить с цитированием
  #2 (permalink)  
Старый 14.03.2015, 16:30
Новичок на форуме
Посмотреть профиль Найти все сообщения от nuboquest
 
Регистрация: 14.03.2015
Сообщений: 7

Ivan_Ivanoff_24,
может быть паттерн "наблюдатель" (observer) имеется в виду?
Ответить с цитированием
  #3 (permalink)  
Старый 14.03.2015, 16:35
Новичок на форуме
Посмотреть профиль Найти все сообщения от nuboquest
 
Регистрация: 14.03.2015
Сообщений: 7

Сообщение от Ivan_Ivanoff_24
"В системе имеется некоторое число объектов, которые сообщаются между собой с помощью событий.
Написать на native JavaScript класс, который будет предоставлять им эту возможность.
Реализовать на примере."
Не совсем ясно из постановки, должны ли все объекты как-то реагировать на сообщения, или просто "знать" какое то состояние. Выложите задание полностью.
Сообщение от Ivan_Ivanoff_24
как реализовать получение и отсылку сообщений?
Это реализовывать не надо. JS -- это ООП-язык, там и так есть объекты и сообщения.
Ответить с цитированием
  #4 (permalink)  
Старый 14.03.2015, 16:39
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

В javascript нет событий если не считать Dom, но никто не мешает их эмулировать. События это объект который хронит в себе ассоциативный массив (где ключ это имя события) массив обработчиков. Это совсем не сложно.
Ответить с цитированием
  #5 (permalink)  
Старый 14.03.2015, 16:59
Новичок на форуме
Посмотреть профиль Найти все сообщения от nuboquest
 
Регистрация: 14.03.2015
Сообщений: 7

Ivan_Ivanoff_24,
И, кстати, объекты не могут общаться с помощью событий. Объекты обмениваются сообщениями, события тут не при чем. Другое дело, что событие само может являться объектом, и слать сообщения. Тот кто писал это задание сам, вероятно, слабо представляет, что такое ООП.
Ответить с цитированием
  #6 (permalink)  
Старый 14.03.2015, 17:18
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

/**
 * @class Base
 */
var Base = function Base() {};
Base.prototype = {

    /**
     * @private
     */
    _events: null,

    /**
     * @method trigger
     * @param {String} eventName
     * @param {*|Array} [arg]
     * @returns @this
     */
    trigger: function (eventName, arg) {

        var $Event = function (type) {
            this.type = type;
        };

        if (!this._events || !this._events[eventName]) {
            return this;
        }

        if (!(arg instanceof Array)) {
            arg = [arg];
        }

        var iteration = function () {

            var arrEvents = this._events[eventName].slice();

            arrEvents.forEach(function (handler) {
                handler.apply(new $Event(eventName), arg);
            });

        }.bind(this);

        iteration();


        return this;
    },

    /**
     * @method bind
     * @param {String|Object} eventName
     * @param {function|Array} [handler]
     * @returns @this
     */
    bind: function (eventName, handler) {

        if (eventName == undefined) {
            console.log("Неверные параметры!");
            return this;
        }

        if (typeof eventName == "object") {
            this.iterationObj(eventName, function (handler, eventName) {
                this.bind(eventName, handler);
            }.bind(this));
            return this;
        }

        if (handler == undefined) {
            console.log("Неверные параметры!");
            return this;
        }

        if (!this._events) {
            this._events = {};
        }

        if (!this._events[eventName]) {
            this._events[eventName] = [];
        }

        if (!(handler instanceof Array)) {
            this._events[eventName].push(handler);
        } else {
            this._events[eventName] = this._events[eventName].concat(handler);
        }

        return this;
    },

    /**
     * @method unbind
     * @param {String|Object} [eventName]
     * @param {function} [handler]
     * @returns @this
     */
    unbind: function (eventName, handler) {

        if (eventName == undefined) {
            this._events = {};
            return this;
        } else if (eventName instanceof Object) {
            for (var key in eventName)
                if (eventName.hasOwnProperty(key))
                    this.unbind(key, key[eventName]);

            return this;
        }

        if (handler == undefined) {
            if (this._events && eventName in this._events) {
                this._events[eventName] = [];
                return this;
            }
            return this;
        }

        for (var i = 0; i < this._events[eventName].length; i++) {

            if (this._events[eventName][i] == handler) {
                this._events[eventName].splice(i, 1);
                break;
            }

        }

        return this;
    }

};


var Obj1 = new Base();

Obj1.bind("some event", function () {
  alert("some event!");
});

Obj1.bind("some event", function () {
  alert("some event!2");
});

Obj1.trigger("some event", []);


Раньше я использовал этот объект как базовый класс. Я наследовался от него и все мои объекты могли общаться событиями. Сейчас я использую события взятые из backbone (хотя в целом там тоже самое)

Последний раз редактировалось tsigel, 14.03.2015 в 17:22.
Ответить с цитированием
  #7 (permalink)  
Старый 14.03.2015, 17:21
Новичок на форуме
Посмотреть профиль Найти все сообщения от nuboquest
 
Регистрация: 14.03.2015
Сообщений: 7

Сообщение от Ivan_Ivanoff_24
чтобы объект знал, от кого ему пришло сообщение, сохранял его у себя в каком-то свойстве и мы могли бы извлечь эти данные. Ну и не всё понятно с механизмом отправки.
O={
 sendTo: function(obj, msg){obj.receiveFrom(this, msg)},
 receiveFrom: function(sender, msg){console.log(this.name+": I have receive the message '"+msg+"' from "+sender.name)},
 create: function(name){var o=Object.create(this); window[name]=o; o.name=name}
}

O.create("object1")
O.create("object2")

object1.sendTo(object2, "Hello!")

//  object2: I have receive the message 'Hello!' from object1
Ответить с цитированием
  #8 (permalink)  
Старый 14.03.2015, 18:02
Новичок на форуме
Посмотреть профиль Найти все сообщения от nuboquest
 
Регистрация: 14.03.2015
Сообщений: 7

Сообщение от tsigel
если не считать Dom
Да, еще если не считать событий мыши, событий сети, событий клавиатуры, и еще over100000 событий, и забываем, что серверный JS существует еще внезапно, переполненный своими событиями. А так, да, чисто дом. Так оно и надо писать: new Ko-ko-ko dom ko-ko-ko.
Ответить с цитированием
  #9 (permalink)  
Старый 14.03.2015, 18:20
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Сообщение от nuboquest
Да, еще если не считать событий мыши, событий сети, событий клавиатуры
nuboquest, вообще-то это и есть dom события
Ответить с цитированием
  #10 (permalink)  
Старый 14.03.2015, 18:25
Новичок на форуме
Посмотреть профиль Найти все сообщения от nuboquest
 
Регистрация: 14.03.2015
Сообщений: 7

tsigel,
Ну и какое же они имеют отношение к документу? Если какой то придурок когда то что-то как-то назвал, другие не обязаны повторять за ним эту глупость.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книжко по ООП krasovsky Учебные материалы 2 03.04.2013 12:50
Помогите с ооп Zim_one Общие вопросы Javascript 8 18.11.2012 00:11
ООП в javascript iostream21 Общие вопросы Javascript 11 12.07.2012 00:16
Есть ли смысл использовать ООП. Duda.Ml1986@gmail.com Оффтопик 18 18.02.2012 21:47
ООП PHP вопрос mycoding Серверные языки и технологии 9 03.06.2010 02:57