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 new
operador:
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 new
operador:
var subInstance = new Sub();
A diferença com o primeiro exemplo é que quando colocamos apply
o Super
construtor no this
objeto interno Sub
, ele adiciona as propriedades atribuídas a this
on Super
, diretamente na nova instância, por exemplo, subInstance
contém as propriedades member1
e member2
diretamente ( 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 new
operador e, como você pode ver, a this
palavra-chave não está envolvida.
var subInstance = createSub();
ECMAScript 5th Ed. Object.create
mé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 subInstance
contém fisicamente somente a member3
propriedade.