ОО Javascript - События - PullRequest
       3

ОО Javascript - События

3 голосов
/ 11 августа 2011

Я пытаюсь выучить JavaScript, используя ОО-подход. Это мой код:

/*global document, MouseEvent */
MouseEvent.prototype.mouseCoordinates = function () {
    return {
        'x' : this.pageX - this.target.offsetLeft,
        'y' : this.pageY - this.target.offsetTop
    };
};

(function () {
    var Pencil = function () {},
        Canvas = function () {
            this.element = document.getElementById('canvas');
            this.tool = new Pencil();

            this.element.addEventListener('click', this.tool.draw, false);
        },
        c;

    Pencil.prototype.draw = function (event) {
        var context = event.target.getContext('2d'),
            coordinates = event.mouseCoordinates();

        context.fillRect(coordinates.x, coordinates.y, 5, 5);
    };

    c = new Canvas();
}());

Я пытаюсь сделать что-то вроде MS Paint. Итак, я создал объект Canvas и объект Pencil. Я могу сделать это, используя процедурный подход, но я не хочу. Я не хочу сейчас пользоваться какой-либо библиотекой, я просто учусь.

У меня есть следующие вопросы:

  • Есть ли хорошая практика для регистрации событий? Должен ли я регистрировать события, используя конструктор объекта?

  • У моего объекта холста есть инструмент (в данном случае карандаш). Концептуально это не хорошо. Мой холст не должен иметь объект инструмента. Это должно обеспечить поверхность для рисования и все! Но это как обратный вызов (событие клика). Как я мог решить это?

  • У каждого инструмента будет одинаковый интерфейс, но разное поведение. Могу ли я создавать интерфейсы, используя Javascript?

  • Что еще я могу улучшить?

UPDATE:

(function () {
    var pencil = {
        draw : function (event) {
            var context = event.target.getContext('2d'),
                coordinates = event.mouseCoordinates();

                context.fillRect(coordinates.x, coordinates.y, 5, 5);
        }
    },
        currentTool = pencil,
        canvas = (function () {
            var object = {};
            object.element = document.getElementById('canvas');

            object.element.addEventListener('click', function (event) {
                currentTool.draw(event);
            }, false);

            return object;
        }());
}());

Я следовал всем советам (спасибо, я ценю вашу помощь!). Как вы думаете? Теперь у меня есть «глобальная» переменная currentTool. Что вы думаете об этом? Спасибо.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 августа 2011
  • Довольно сложно регистрировать события без каких-либо рамок (захват или пузырящаяся фаза это только начало твоих проблем), так вот есть ответы на другие вопросы

  • Ваш карандашный инструмент может прослушивать события холста и, в конечном итоге,
    когда кто-то щелкает по нему, карандашный инструмент выглядит как
    глобальный объект (синглтон), если это активный инструмент. Если это так, вы
    изменить цвет некоторых подходящих пикселей на холсте.

  • В javascript нет интерфейса (как в php), только прототип
    поведение. Тем не менее, вы можете написать абстрактный класс, методы которого
    (в пространстве имен прототипа) сгенерирует исключение "не реализовано",
    заставляя вас переопределить их.

  • Что касается улучшений, вы наверняка столкнетесь с
    другое поведение браузера. Вот почему (ну, это еще не все)
    рамки существуют. Как я вижу, вам нравится развиться в ОО стиле, я
    может дать вам совет попробовать MooTools или, что сложнее, Google
    Закрытие рамок. Не стесняйтесь задавать вопросы о них здесь.

0 голосов
/ 11 августа 2011

Я знаю, что вы сказали, что не хотите использовать библиотеку, но я рекомендую вам изучить исходный код в хорошей библиотеке с открытым исходным кодом, такой как jquery. Если вы хотите серьезно узнать больше, вы должны взглянуть на код, написанный действительно хорошими разработчиками, и посмотреть, как они сделали то, о чем вы только что спросили. Насколько я могу судить, это, кроме сохранения чтения, является одним из лучших способов изучения языка программирования с хорошей практикой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...