nodejs example ejemplos ecmascript clases javascript oop abstract-class ecmascript-6

javascript - example - ¿ECMAScript 6 tiene una convención para clases abstractas?



prototype javascript ejemplos (1)

Esta pregunta ya tiene una respuesta aquí:

Me sorprendió no poder encontrar nada sobre las clases abstractas al leer sobre ES6. (Por "clase abstracta" me refiero al significado de Java en el que una clase abstracta declara firmas de métodos que una subclase debe implementar para ser instanciable).

¿Alguien sabe de alguna convención que se haya establecido para implementar clases abstractas en ES6? Sería bueno poder detectar una violación de clase abstracta con análisis estático.

Si tuviera que generar un error en tiempo de ejecución para señalar un intento de instanciación de clase abstracta, ¿cuál sería el error?


ES2015 no tiene clases de estilo Java con posibilidades integradas para su patrón de diseño deseado. Sin embargo, tiene algunas opciones que pueden ser útiles, dependiendo exactamente de lo que intente lograr.

Si desea una clase que no se puede construir, pero cuyas subclases sí, puede usar new.target :

class Abstract { constructor() { if (new.target === Abstract) { throw new TypeError("Cannot construct Abstract instances directly"); } } } class Derived extends Abstract { constructor() { super(); // more Derived-specific stuff here, maybe } } const a = new Abstract(); // new.target is Abstract, so it throws const b = new Derived(); // new.target is Derived, so no error

Para obtener más detalles sobre new.target , puede leer esta descripción general de cómo funcionan las clases en ES2015: http://www.2ality.com/2015/02/es6-classes-final.html

Si está buscando específicamente la necesidad de implementar ciertos métodos, también puede verificar eso en el constructor de la superclase:

class Abstract { constructor() { if (this.method === undefined) { // or maybe test typeof this.method === "function" throw new TypeError("Must override method"); } } } class Derived1 extends Abstract {} class Derived2 extends Abstract { method() {} } const a = new Abstract(); // this.method is undefined; error const b = new Derived1(); // this.method is undefined; error const c = new Derived2(); // this.method is Derived2.prototype.method; no error