Erbe
Ich verwende eine Notation für die Vererbung , die auf ExtJS 3 basiert. Ich finde, dass dies der Emulation der klassischen Vererbung in Java ziemlich nahe kommt. Es läuft grundsätzlich wie folgt ab:
// 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
Ich stimme auch Eric Miraglia darin zu, sich an Namespaces zu halten, sodass der obige Code in einem eigenen Kontext außerhalb des Fensterobjekts ausgeführt werden sollte. Dies ist wichtig, wenn Sie beabsichtigen, Ihren Code als eines von vielen gleichzeitigen Frameworks / Bibliotheken auszuführen, die im Browserfenster ausgeführt werden.
Dies bedeutet, dass der einzige Weg zum Fensterobjekt über Ihren eigenen Namespace / Modulobjekt führt:
// 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
})();
Schnittstellen
Sie können auch fortschrittlichere OOP-Konstrukte wie Schnittstellen verwenden, um Ihr Anwendungsdesign zu verbessern. Mein Ansatz bei diesen ist es, die zu verbessern Function.prototype
, um eine Notation in dieser Richtung zu erhalten:
var Dog = Object.extend(Animal, {
bark: function() {
alert('woof');
}
// more methods ..
}).implement(Mammal, Carnivore);
OO-Muster
Was 'Patterns' im Java-Sinne betrifft, habe ich nur Verwendung für das Singleton-Pattern (ideal zum Zwischenspeichern) und das Observer-Pattern gefunden für ereignisgesteuerte Funktionen gefunden, z. B. das Zuweisen einiger Aktionen, wenn ein Benutzer auf eine Schaltfläche klickt.
Ein Beispiel für die Verwendung des Beobachtermusters wäre:
// 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');
});
Und das sind nur ein paar Tricks in meiner Tasche von OO JS, ich hoffe, sie sind nützlich für Sie.
Ich empfehle, wenn Sie diesen Weg gehen möchten, Douglas Crockfords Javascript: the Good Parts zu lesen . Es ist ein brillantes Buch für dieses Zeug.