Je préfère utiliser l'ouvrage de Daniel X. Moore {SUPER: SYSTEM}
. Il s'agit d'une discipline qui offre des avantages tels que de véritables variables d'instance, un héritage basé sur les traits, des hiérarchies de classes et des options de configuration. L'exemple ci-dessous illustre l'utilisation de véritables variables d'instance, ce qui, à mon avis, est le plus grand avantage. Si vous n'avez pas besoin de variables d'instance et que vous vous contentez de variables publiques ou privées, il existe probablement des systèmes plus simples.
function Person(I) {
I = I || {};
Object.reverseMerge(I, {
name: "McLovin",
age: 25,
homeState: "Hawaii"
});
return {
introduce: function() {
return "Hi I'm " + I.name + " and I'm " + I.age;
}
};
}
var fogel = Person({
age: "old enough"
});
fogel.introduce(); // "Hi I'm McLovin and I'm old enough"
Wow, ce n'est pas vraiment très utile en soi, mais regardez l'ajout d'une sous-classe :
function Ninja(I) {
I = I || {};
Object.reverseMerge(I, {
belt: "black"
});
// Ninja is a subclass of person
return Object.extend(Person(I), {
greetChallenger: function() {
return "In all my " + I.age + " years as a ninja, I've never met a challenger as worthy as you...";
}
});
}
var resig = Ninja({name: "John Resig"});
resig.introduce(); // "Hi I'm John Resig and I'm 25"
Un autre avantage est la possibilité d'avoir des modules et un héritage basé sur les traits.
// The Bindable module
function Bindable() {
var eventCallbacks = {};
return {
bind: function(event, callback) {
eventCallbacks[event] = eventCallbacks[event] || [];
eventCallbacks[event].push(callback);
},
trigger: function(event) {
var callbacks = eventCallbacks[event];
if(callbacks && callbacks.length) {
var self = this;
callbacks.forEach(function(callback) {
callback(self);
});
}
},
};
}
Un exemple d'inclusion du module bindable dans la classe de la personne.
function Person(I) {
I = I || {};
Object.reverseMerge(I, {
name: "McLovin",
age: 25,
homeState: "Hawaii"
});
var self = {
introduce: function() {
return "Hi I'm " + I.name + " and I'm " + I.age;
}
};
// Including the Bindable module
Object.extend(self, Bindable());
return self;
}
var person = Person();
person.bind("eat", function() {
alert(person.introduce() + " and I'm eating!");
});
person.trigger("eat"); // Blasts the alert!
Divulgation : Je suis Daniel X. Moore et ceci est mon {SUPER: SYSTEM}
. C'est la meilleure façon de définir une classe en JavaScript.