En JavaScript, vous n'avez pas de classes, mais vous pouvez obtenir l'héritage et la réutilisation du comportement de plusieurs manières:
Héritage pseudo-classique (par prototypage):
function Super () {
this.member1 = 'superMember1';
}
Super.prototype.member2 = 'superMember2';
function Sub() {
this.member3 = 'subMember3';
//...
}
Sub.prototype = new Super();
Doit être utilisé avec l' new
opérateur:
var subInstance = new Sub();
Application de fonction ou "chaînage de constructeur":
function Super () {
this.member1 = 'superMember1';
this.member2 = 'superMember2';
}
function Sub() {
Super.apply(this, arguments);
this.member3 = 'subMember3';
}
Cette approche doit également être utilisée avec l' new
opérateur:
var subInstance = new Sub();
La différence avec le premier exemple est que lorsque nous apply
le Super
constructeur de l' this
objet à l'intérieur Sub
, il ajoute les propriétés assignées à this
on Super
, directement sur la nouvelle instance, par exemple subInstance
contient les propriétés member1
et member2
directement ( subInstance.hasOwnProperty('member1') == true;
).
Dans le premier exemple, ces propriétés sont atteintes via la chaîne de prototypes , elles existent sur un [[Prototype]]
objet interne .
Héritage parasite ou constructeurs de puissance:
function createSuper() {
var obj = {
member1: 'superMember1',
member2: 'superMember2'
};
return obj;
}
function createSub() {
var obj = createSuper();
obj.member3 = 'subMember3';
return obj;
}
Cette approche est basée essentiellement sur "l'augmentation d'objet", vous n'avez pas besoin d'utiliser l' new
opérateur, et comme vous pouvez le voir, le this
mot-clé n'est pas impliqué.
var subInstance = createSub();
ECMAScript 5e éd. Object.create
méthode:
// Check if native implementation available
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {} // empty constructor
F.prototype = o; // set base object as prototype
return new F(); // return empty object with right [[Prototype]]
};
}
var superInstance = {
member1: 'superMember1',
member2: 'superMember2'
};
var subInstance = Object.create(superInstance);
subInstance.member3 = 'subMember3';
La méthode ci-dessus est une technique d'héritage prototypique proposée par Crockford .
Les instances d'objet héritent d'autres instances d'objet, c'est tout.
Cette technique peut être mieux que simple « augmentation de l' objet » , car les propriétés héritées ne sont pas copiées sur toutes les nouvelles instances d'objet, puisque la base de l' objet est défini comme [[Prototype]]
de l' étendue objet, dans l'exemple ci - dessus subInstance
contient physiquement que la member3
propriété.