poo - Cómo crear una clase base abstracta en JavaScript que no puede ser instanciada
programacion de objetos en javascript (3)
Al adaptar la respuesta de @ levi, puede ir con una solución similar para usar con ES6 hoy (ya que new.target
aún no está establecido):
Puedes verlo ejecutándose en la réplica de Babel: http://bit.ly/1cxYGOP
class Node {
constructor () {
if (this.constructor === Node)
throw new Error("Cannot instantiate Base Class");
}
callMeBaby () {
console.log("Hello Baby!");
}
}
class AttributionalNode extends Node {
constructor () {
super();
console.log("AttributionalNode instantiated!");
}
}
let attrNode = new AttributionalNode();
attrNode.callMeBaby();
let node = new Node();
Tengo una clase
function Node() {
//implementation
}
y otra clase
function AttributionalNode() {
this.prototype.setAttr = function (attr) {
this.atText = attr;
};
}
AttributionalNode.prototype = new Node();
AttributionalNode.prototype.constructor = AttributionalNode;
¿Cómo hacer Nodo de clase () para que no pueda ser instanciado? por ejemplo, cuando intento
var node = new Node();
Entonces arroja una excepción?
En los motores de JavaScript que admiten la sintaxis de clase ECMAScript 2015 (también conocida como ES6), esto se puede lograr utilizando la meta-propiedad new.target
:
function Node() {
if (new.target === Node) throw TypeError("new of abstract class Node");
}
o usando la sintaxis de clase:
class Node {
constructor () {
if (new.target === Node) throw TypeError("new of abstract class Node");
}
}
en cualquier caso, simplemente defina AttributionalNode
como:
class AttributionalNode extends Node {
constructor () {
super();
}
setAttr(attr) {
this.atText = attr;
}
}
new Node(); // will throw TypeError
new AttributionalNode(); // works fine
Para obtener una explicación más detallada de new.target
consulte la sección 4.2 de este documento .
Esto funcionaría:
function Node() {
if (this.constructor === Node) {
throw new Error("Cannot instantiate this class");
}
}
function AttributionalNode() {
Node.call(this); // call super
}
AttributionalNode.prototype = Object.create(Node.prototype);
AttributionalNode.prototype.setAttr = function (attr) {
this.atText = attr;
};
AttributionalNode.prototype.constructor = AttributionalNode;
var attrNode = new AttributionalNode();
console.log(attrNode);
new Node();
Nota: no puede referirse a este this.prototype
dentro del constructor, ya que el prototipo es solo una propiedad de la función constructora, no de las instancias.
Además, consulte aquí un buen artículo sobre cómo extender correctamente las clases de JS.