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 que la clase Node () no pueda ser instanciada? por ejemplo, cuando intento
var node = new Node();Entonces, ¿arroja una excepción?
En los motores de JavaScript que admiten la sintaxis de clase de ECMAScript 2015 (también conocido como ES6), esto se puede lograr utilizando la 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 una explicación más detallada de new.target ver 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 hacer referencia a this.prototype dentro del constructor, ya que el prototipo es solo una propiedad de la función del constructor, no de las instancias.
Además, vea aquí un buen artículo sobre cómo extender correctamente las clases JS.
Adaptando la respuesta de @ levi, puede optar por 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();