Наследование
Я использую нотацию для наследования , основанную на 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 . Это блестящая книга для этого материала.