programacion poo orientado objetos herencia es6 ejercicios ejemplos desde clases clase acceder javascript inheritance design-patterns

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.