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 new
operatorem:
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 new
operatora:
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 ( ).apply
Super
this
Sub
this
Super
subInstance
member1
member2
subInstance.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ć new
operatora i jak widać, this
słowo kluczowe nie jest używane.
var subInstance = createSub();
ECMAScript 5th Ed. Object.create
metoda:
// 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 subInstance
zawiera fizycznie tylko member3
nieruchomości.