Ответы пользователя по тегу ООП
  • Как правильно получить доступ к внешнему объекту из внутреннего в JavaScript?

    У вас же this везде ссылается на корневой объект, значит ничего не мешает получить вложенный и работать с его свойствами:

    function Mock() {
        this.val = 'val';
        this.log = {
            start: function() {
                this.log.timer = setInterval(function() {
                    console.log(this.val);
                }.bind(this), 1000);
            }.bind(this),
            stop: function() {
                clearInterval(this.log.timer);
                delete this.log.timer;
            }.bind(this)
        };
    }

    Но конечно лучше просто разделить сущности:

    function Timer(handler, interval) {
        this.handler = handler;
        this.interval = interval;
    }
    
    Timer.prototype.start = function () {
        this.timer = setInterval(this.handler, this.interval);
    };
    
    Timer.prototype.stop = function () {
        clearInterval(this.timer);
        delete this.timer;
    };
    
    function Mock() {
        this.val = 'val';
        this.log = new Timer(function () {
            console.log(this.val);
        }.bind(this), 1000);
    }
    Ответ написан
  • Чем является событие в объекте javaScript?

    Литература описывает то, что доступно к использованию разработчикам сайтов. Такие вещи как DOM являются частью браузера и написаны с использованием низкоуровневого кода и внутренних возможностей, которые не предоставляют разработчикам по различным причинам. Вполне вероятно, что событийная модель у DOM-элементов тоже написана с использованием внутренних средств. Хотя реализовать этот паттерн на чистом JavaScript'е не представляет из себя ничего сложного:

    class Element {
        constructor() {
            this._events = {};
        }
    
        addEventListener(event, listener) {
            let listeners = this._events[event];
    
            if (!listeners) {
                listeners = this._events[event] = [];
            }
    
            listeners.push(listener);
        }
    
        removeEventListener(event, listener) {
            const listeners = this._events[event];
    
            if (listeners) {
                const index = listeners.indexOf(listener);
    
                if (index !== -1) {
                    listeners.splice(index, 1);
                }
            }
        }
    
        dispatchEvent(event) {
            const listeners = this._events[event];
    
            if (listeners) {
                for (let listener of listeners) {
                    listener(event);
                }
            }
        }
    }

    С помощью Map можно и вовсе избавиться от псевдоприватного свойства _events и хранить его ассоциативно.
    Ответ написан
    Комментировать
  • Проксирование изменений вложенного объекта в JavaScript?

    https://jsfiddle.net/g1kebLbg Всё очень сложно. На это ушло 2 часа и я всё-равно не уверен, что нет багов.
    Ответ написан
    Комментировать