Примеры практических шаблонов объектно-ориентированного проектирования javascript - PullRequest
81 голосов
/ 16 сентября 2010

Какие шаблоны объектно-ориентированного проектирования вы используете в javascript вашего приложения и почему?

Не стесняйтесь размещать код, даже если к нему не прикреплен официальный шаблон оформления.

Я написал много javascript, но я не применял много объектно-ориентированных шаблонов к тому, что я делаю, и я уверен, что мне многое не хватает.

Ответы [ 7 ]

53 голосов
/ 16 сентября 2010

Ниже приведены три популярных шаблона JavaScript.Их легко реализовать из-за замыканий :

Вы также можете проверить:

Ниже приводится Google I /О выступлении Диаса в 2008 году, где он обсуждает некоторые темы из своей книги:

25 голосов
/ 10 октября 2011

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

Я использую нотацию для наследования , основанную на ExtJS 3 , которая, как мне кажется, работает довольно близко к эмуляции классического наследования в Java. Это в основном работает следующим образом:

// Create an 'Animal' class by extending
// the 'Object' class with our magic method
var Animal = Object.extend(Object, {
    move : function() {alert('moving...');}
});

// Create a 'Dog' class that extends 'Animal'
var Dog = Object.extend(Animal, {
    bark : function() {alert('woof');}
});

// Instantiate Lassie
var lassie = new Dog();

// She can move and bark!
lassie.move();
lassie.bark();

* Namespaces 1013 *

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

Это означает, что единственный путь к объекту окна - через ваше собственное пространство имен / объект модуля:

// Create a namespace / module for your project
window.MyModule = {};

// Commence scope to prevent littering 
// the window object with unwanted variables
(function() {

    var Animal = window.MyModule.Animal = Object.extend(Object, {
         move: function() {alert('moving...');}
    });

    // .. more code

})();

Интерфейсы

Вы также можете использовать более продвинутые конструкции ООП, такие как интерфейсы, для улучшения дизайна вашего приложения. Мой подход к этим заключается в улучшении Function.prototype, чтобы получить обозначения по следующим направлениям:

var Dog = Object.extend(Animal, {
     bark: function() {
         alert('woof');
     }
     // more methods ..
}).implement(Mammal, Carnivore);

OO Patterns

Что касается «шаблонов» в смысле Java, я нашел применение только для шаблона Singleton (отлично подходит для кэширования) и шаблона Observer для функций, управляемых событиями, таких как как назначение некоторых действий, когда пользователь нажимает на кнопку.

Пример использования шаблона наблюдателя:

// Instantiate object
var lassie = new Animal('Lassie');

// Register listener
lassie.on('eat', function(food) {
   this.food += food;
});

// Feed lassie by triggering listener
$('#feeding-button').click(function() {
    var food = prompt('How many food units should we give lassie?');
    lassie.trigger('eat', [food]);
    alert('Lassie has already eaten ' + lassie.food + ' units');
});

И это всего лишь пара трюков в моей сумке с OO JS, надеюсь, они пригодятся вам.

Я рекомендую, если вы собираетесь пойти по этому пути, прочитав Дугласа Крокфордса Javascript: The Good Parts . Это блестящая книга для этого материала.

20 голосов
/ 16 сентября 2010

Я болею за Модуль Pattern . Это способ реализации расширяемых, независимых (в большинстве случаев) сред.

Пример:

Структура, Q, определяется следующим образом:

var Q = {};

Чтобы добавить функцию:

Q.test = function(){};

Эти две строки кода используются вместе для формирования модулей . Идея, лежащая в основе модулей, заключается в том, что все они расширяют некоторую базовую структуру, в данном случае Q, но не зависят друг от друга (если разработаны правильно) и могут быть включены в любом порядке.

В модуле вы сначала создаете каркасный объект, если он не существует (что является примером шаблона Singleton ):

if (!Q)
    var Q = {};

Q.myFunction = function(){};

Таким образом, вы можете иметь несколько модулей (например, выше) в отдельных файлах и включать их в любом порядке. Любой из них создаст объект фреймворка, а затем расширит его. Нет необходимости проверять, существует ли структура. Затем, чтобы проверить, существует ли модуль / функция в пользовательском коде:

if (Q.myFunction)
    Q.myFunction();
else
    // Use a different approach/method
6 голосов
/ 16 сентября 2010

Шаблон синглтона часто очень полезен для «инкапсуляции» и организации вещей.Вы даже можете изменить доступность.

var myInstance = {
  method1: function () {
    // ...
  },
  method2: function () {
    // ...
  }
};

Самый простой способ реализовать синглтон в javascript

4 голосов
/ 16 сентября 2010

Мне действительно нравится шаблон цепочки методов jquery , позволяющий вам вызывать несколько методов для одного объекта.Это позволяет легко выполнять несколько операций в одной строке кода.

Пример:

$('#nav').click(function() {
   $(this).css('color','#f00').fadeOut();
});
3 голосов
/ 18 мая 2015

Одним из полезных шаблонов в мире javascript является шаблон цепочки, который в первую очередь популяризируется LINQ, а также используется в jQuery.

этот шаблон позволяет нам вызывать различные методы класса в цепочке..

основная структура этого шаблона будет выглядеть как

var Calaculator = function (init) {
    var result = 0;
    this.add = function (x) { result += (init + x); return this; };
    this.sub = function (x) { result += (init - x); return this; };
    this.mul = function (x) { result += (init * x); return this; };
    this.div = function (x) { result += (init / x); return this; };

    this.equals = function (callback) {
        callback(result);
    }

    return this;
};


new Calaculator(0)
    .add(10)
    .mul(2)
    .sub(5)
    .div(3)
    .equals(function (result) {
        console.log(result);
    });

. Основная идея этого шаблона - this ключевое слово, которое делает возможным доступ к другому общедоступному члену функции Калькулятора.

3 голосов
/ 16 сентября 2010

Мне очень нравится шаблон Decorator с плагинами jQuery. Вместо того, чтобы модифицировать плагины в соответствии с вашими потребностями, напишите собственный плагин, который просто перенаправляет запросы и добавляет дополнительные параметры и функциональность.

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

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

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