Si vous ne voulez pas dépendre d'autres bibliothèques, vous pouvez le faire :
function A() {}
A.prototype.foo = function() {};
function B() {
A.call(this);
//Or, if there are arguments that need to be passed to A(),
//this might be preferable:
//A.apply(this, arguments);
}
B.prototype = new A();
//Or, if the browser supports ECMAScript 5 and/or you have a shim for Object.create,
//it would be better to do this:
B.prototype = Object.create(A.prototype);
$.extend(B.prototype, {
//set the constructor property back to B, otherwise it would be set to A
constructor: B,
bar: function() {}
});
Veillez à définir les propriétés éventuelles dans le constructeur plutôt que sur le prototype, par exemple :
function A() {
this.baz = null;
}
Cela évite d'avoir des propriétés de prototype partagées involontairement.
Il existe des bibliothèques qui facilitent l'héritage prototypique :
Notes :
- Chaque fois qu'un prototype est remplacé, y compris par une extension, il est préférable de de remettre sa propriété constructor sur le constructeur correct. C'est pourquoi nous avons défini B.prototype.constructor sur B. Si vous remplaciez A.prototype, vous devriez procéder comme suit :
...
A.prototype = {
constructor: A,
foo: function() {}
//other methods...
}
-
B.prototype = Object.create(A.prototype)
est préféré à B.prototype = new A()
parce qu'il vous permet de le détecter rapidement si vous avez oublié d'appeler A() à partir du constructeur de B() ; il permet également à A() d'avoir des paramètres obligatoires. Vous aurez besoin d'une shim pour les navigateurs plus anciens ; la shim la plus simple (bien qu'elle ne supporte pas la spécification Object.create complète) se trouve au bas de cette page : http://javascript.crockford.com/prototypal.html .