En JavaScript no tiene clases, pero puede obtener herencia y reutilización del comportamiento de muchas maneras:
Herencia pseudo-clásica (mediante la creación de prototipos):
function Super () {
this.member1 = 'superMember1';
}
Super.prototype.member2 = 'superMember2';
function Sub() {
this.member3 = 'subMember3';
//...
}
Sub.prototype = new Super();
Debe usarse con el newoperador:
var subInstance = new Sub();
Aplicación de función o "encadenamiento de constructores":
function Super () {
this.member1 = 'superMember1';
this.member2 = 'superMember2';
}
function Sub() {
Super.apply(this, arguments);
this.member3 = 'subMember3';
}
Este enfoque también debe usarse con el newoperador:
var subInstance = new Sub();
La diferencia con el primer ejemplo es que cuando applyel Superconstructor del thisobjeto dentro Sub, agrega las propiedades asignadas a thison Super, directamente en la nueva instancia, por ejemplo, subInstancecontiene las propiedades member1y member2directamente (subInstance.hasOwnProperty('member1') == true; ).
En el primer ejemplo, esas propiedades se alcanzan a través de la cadena de prototipos , existen en un [[Prototype]]objeto interno .
Herencia parasitaria o constructores de energía:
function createSuper() {
var obj = {
member1: 'superMember1',
member2: 'superMember2'
};
return obj;
}
function createSub() {
var obj = createSuper();
obj.member3 = 'subMember3';
return obj;
}
Este enfoque se basa básicamente en el "aumento de objetos", no es necesario utilizar el newoperador y, como puede ver, la thispalabra clave no está involucrada.
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';
El método anterior es una técnica de herencia prototípica propuesta por Crockford .
Las instancias de objetos heredan de otras instancias de objetos, eso es todo.
Esta técnica puede ser mejor que el simple "aumento de objetos" porque las propiedades heredadas no se copian en todas las instancias de nuevos objetos, ya que el objeto base se establece como el [[Prototype]]del objeto extendido , en el ejemplo anterior subInstancecontiene físicamente solo la member3propiedad.