Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

421
Vistas
Cómo crear una clase base abstracta en JavaScript que no se puede instanciar

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?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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 .

over 4 years ago · Santiago Trujillo Denunciar

0

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.

over 4 years ago · Santiago Trujillo Denunciar

0

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();
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda