W JavaScript nie masz klas, ale możesz uzyskać dziedziczenie i ponowne wykorzystanie zachowań na wiele sposobów:
Dziedziczenie pseudoklasyczne (poprzez prototypowanie):
function Super () {
this.member1 = 'superMember1';
}
Super.prototype.member2 = 'superMember2';
function Sub() {
this.member3 = 'subMember3';
//...
}
Sub.prototype = new Super();
Powinien być używany z newoperatorem:
var subInstance = new Sub();
Aplikacja funkcji lub „łańcuch konstruktora”:
function Super () {
this.member1 = 'superMember1';
this.member2 = 'superMember2';
}
function Sub() {
Super.apply(this, arguments);
this.member3 = 'subMember3';
}
Takie podejście należy również zastosować w przypadku newoperatora:
var subInstance = new Sub();
Różnica w porównaniu z pierwszym przykładem jest to, że kiedy konstruktor do wnętrza obiektu , dodaje właściwości przypisane na bezpośrednio na nową instancję np zawiera właściwości i bezpośrednio ( ).applySuperthisSubthisSupersubInstancemember1member2subInstance.hasOwnProperty('member1') == true;
W pierwszym przykładzie te właściwości są osiągane przez łańcuch prototypów , istnieją w [[Prototype]]obiekcie wewnętrznym .
Dziedziczenie pasożytnicze lub konstruktorzy mocy:
function createSuper() {
var obj = {
member1: 'superMember1',
member2: 'superMember2'
};
return obj;
}
function createSub() {
var obj = createSuper();
obj.member3 = 'subMember3';
return obj;
}
To podejście opiera się w zasadzie na „rozszerzaniu obiektów”, nie musisz używać newoperatora i jak widać, thissłowo kluczowe nie jest używane.
var subInstance = createSub();
ECMAScript 5th Ed. Object.createmetoda:
// 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';
Powyższa metoda jest prototypową techniką dziedziczenia zaproponowaną przez Crockforda .
Instancje obiektów dziedziczą po innych instancjach obiektów, to wszystko.
Technika ta może być lepiej niż proste „obiekt powiększania”, ponieważ odziedziczone właściwości nie są kopiowane wszystkich nowych instancji obiektów, ponieważ baza obiekt jest ustawiony jak [[Prototype]]z rozszerzonego przedmiotu, w powyższym przykładzie subInstancezawiera fizycznie tylko member3nieruchomości.