Em JavaScript, você não tem classes, mas pode obter herança e reutilização de comportamento de várias maneiras:
Herança pseudo-clássica (por meio de prototipagem):
function Super () {
this.member1 = 'superMember1';
}
Super.prototype.member2 = 'superMember2';
function Sub() {
this.member3 = 'subMember3';
//...
}
Sub.prototype = new Super();
Deve ser usado com o newoperador:
var subInstance = new Sub();
Aplicação de função ou "encadeamento de construtor":
function Super () {
this.member1 = 'superMember1';
this.member2 = 'superMember2';
}
function Sub() {
Super.apply(this, arguments);
this.member3 = 'subMember3';
}
Essa abordagem também deve ser usada com o newoperador:
var subInstance = new Sub();
A diferença com o primeiro exemplo é que quando colocamos applyo Superconstrutor no thisobjeto interno Sub, ele adiciona as propriedades atribuídas a thison Super, diretamente na nova instância, por exemplo, subInstancecontém as propriedades member1e member2diretamente ( subInstance.hasOwnProperty('member1') == true;).
No primeiro exemplo, essas propriedades são alcançadas através da cadeia de protótipos , elas existem em um [[Prototype]]objeto interno .
Herança parasitária ou construtores de energia:
function createSuper() {
var obj = {
member1: 'superMember1',
member2: 'superMember2'
};
return obj;
}
function createSub() {
var obj = createSuper();
obj.member3 = 'subMember3';
return obj;
}
Esta abordagem é baseada basicamente no "aumento do objeto", você não precisa usar o newoperador e, como você pode ver, a thispalavra-chave não está envolvida.
var subInstance = createSub();
ECMAScript 5th Ed. Object.createmétodo:
// 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';
O método acima é uma técnica de herança prototípica proposta por Crockford .
Instâncias de objeto herdam de outras instâncias de objeto, é isso.
Esta técnica pode ser melhor do que simples "aumento do objeto", porque as propriedades herdadas não são copiados sobre todos os novos casos de objeto, uma vez que a base de objeto é definido como a [[Prototype]]da alargada objeto, no exemplo acima subInstancecontém fisicamente somente a member3propriedade.