Основы jQuery ООП - PullRequest
       2

Основы jQuery ООП

20 голосов
/ 27 февраля 2011

Я хочу начать разработку игр jQuery, поэтому мне нужно изучить jQuery OOP. У меня есть некоторый (достаточный) опыт работы с C ++ ООП (разработал несколько игр).

Я знаю, что могу заменить «класс» C ++ на «объекты» jQuery, но я не знаю, как именно это работает.

Также есть ли в jQuery более продвинутые «опции», такие как C ++? (абстрактные классы / объекты, наследование и т.д ...)

Не могли бы вы, ребята, объяснить это мне? (или дайте мне ссылку на несколько хороших руководств по ООП JavaScript).

Ответы [ 3 ]

51 голосов
/ 27 февраля 2011

ООП программирование в JavaScript может быть сделано разными способами. Вокруг много узоров.

Я покажу вам два: реализацию наследования объектов и реализацию композиции объектов.

Это не имеет абсолютно никакого отношения к jQuery. jQuery должен использоваться для манипулирования DOM и обработки событий. Вы не должны создавать свои основные объекты и конструкторы на основе объектов jQuery. В игре роль jQuery заключается в чтении ввода с клавиатуры и, при необходимости, рендеринга вашей графики в DOM (если по какой-то причине вы не используете <canvas>).

Живой пример

Наследование

var Constructor = function(name) {
    this.name = name
};

Constructor.prototype.mymethod = function() {
    alert("my name is : " + this.name);
};

var obj = new Constructor("foo");
obj.mymethod(); // my name is : foo

Здесь мы определяли функцию Constructor, которую можно вызывать для создания нового объекта. Вы обращаетесь к объекту внутри конструктора с помощью this.

Вы можете добавить (статические) методы и переменные в прототип Конструктора, которые будут наследоваться объектом.

function inherits(child, parent) {
    var f = new Function;
    f.prototype = parent.prototype;
    f.prototype.constructor = parent;
    child.prototype = new f;
    child.prototype.constructor = child;
}

Вы можете использовать функцию inherits, которая устанавливает прототип функции конструктора для экземпляра другого конструктора. Это означает, что все методы и свойства этого родительского объекта доступны на дочернем объекте

var SecondConstructor = function(name) {
    this.name = name + "bar";
};
inherits(SecondConstructor, Constructor);
var obj = new SecondConstructor("foo");
obj.mymethod(); // my name is : foobar

Это прототипное наследование JavaScripts. По сути, вы устанавливаете прототип функции для конкретного объекта. Затем, когда вы используете функцию для создания объектов, эти объекты реализуют прототип.

Состав

Использование прототипа на самом деле не обязательно, вместо него можно использовать композицию объектов. Этот метод требует хорошего понимания состояния this, о котором вы можете прочитать в другом месте .

Я собираюсь обмануть и делегировать некоторые утомительные вспомогательные функции underscore.js

var Constructor = function(name) {
    this.name = name;

    this.mymethod = function() {
        alert("my name is : " + this.name);
    };
};

var SecondConstructor = function(name) {
    var constructor = new Constructor(name + "bar");
    _.bindAll(constructor);
    _.extend(this, {
        "mymethod": constructor.mymethod
    });
};

var obj = new SecondConstructor("foo");
obj.mymethod();

Здесь SecondConstructor создает экземпляр Constructor для себя, а не наследует его. Затем он связывает ссылку this на все методы этого объекта-конструктора, чтобы мы могли делегировать вызов mymethod нашему собственному объекту-конструктору. Это работает только для методов, но это не должно быть проблемой, потому что у вас действительно не должно быть открытых полей.

3 голосов
/ 22 июня 2012

Как примечание, я недавно начал использовать Processing.js , который позволяет объявлять классы C ++ - просто используя 'class'.

Позднее Edit (Июнь 2014):

Processing.js был хорош для запуска проектов без необходимости сражаться с JavaScript OOP.Но когда я начал разрабатывать более крупные проекты, я заметил, что Processing.js - это слишком большой уровень абстракции и что на самом деле стоит написать биты ООП и всю структуру кода самостоятельно.

Сейчас я использую PIXI.js как моя библиотека рендеринга / взаимодействия с холстом и структурирование моего кода намного более понятным способом, используя некоторые из трюков ООП, упомянутых выше.

1 голос
/ 27 февраля 2011

ООП очень много не одинаково для всех языков программирования. Объекты в C ++ являются экземплярами классов, а классы - это полностью конструкция времени компиляции. В Javascript нет классов, есть только объекты.

Можно использовать Javascript способами, которые действуют аналогично классам, используя правила области видимости, цепочки прототипов и специальную ссылку «this», но это идиомы, которые навязываются языку, а не являются частью языка. И есть довольно много различных идиом классического стиля общего пользования, и неисчислимое количество изобретенных самим собой.

На мой взгляд, критические различия между javascript и C ++ / C # / Java / и т. Д. Лучше всего понять, изучив правила области видимости. Какие переменные находятся в области видимости в любой точке кода, и на какой объект указывает специальная ссылка «this», когда, что важно понимать при попытке работать с JavaScript.

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