¿Es posible simular una clase base abstracta en JavaScript? ¿Cuál es la forma más elegante de hacerlo?
Diga, quiero hacer algo como: -
var cat = new Animal('cat');
var dog = new Animal('dog');
cat.say();
dog.say();
Debería mostrar: 'ladrido', 'miau'
javascript
oop
abstract
Sabya
fuente
fuente
Respuestas:
Una forma sencilla de crear una clase abstracta es la siguiente:
La
Animal
"clase" y lasay
método son abstractos.Crear una instancia arrojaría un error:
Así es como "heredas" de él:
Dog
se parece a él.Y así es como se desarrolla tu escenario:
Violín aquí (mira la salida de la consola).
fuente
Clases de JavaScript y herencia (ES6)
De acuerdo con ES6, puede usar clases de JavaScript y herencia para lograr lo que necesita.
Referencia: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
En primer lugar, definimos nuestra clase abstracta. No se puede crear una instancia de esta clase, pero se puede ampliar. También podemos definir funciones que se deben implementar en todas las clases que amplían esta.
Después de eso, podemos crear nuestras clases concretas. Estas clases heredarán todas las funciones y comportamientos de la clase abstracta.
Y los resultados ...
fuente
Te refieres a algo como esto:
fuente
whattosay
no está definido en animal ) y que esta respuesta claramente pregunta si la respuesta propuesta era la que buscaba el interrogador. No pretende dar una solución para clases abstractas en javascript. El interrogador no se molestó en responderme a mí ni a nadie más, así que no tengo idea de si le funcionó. Lamento si la respuesta propuesta por un niño de cinco años a la pregunta de otra persona no funcionó para usted.Es posible que desee consultar la Clase base de Dean Edwards: http://dean.edwards.name/weblog/2006/03/base/
Alternativamente, existe este ejemplo / artículo de Douglas Crockford sobre la herencia clásica en JavaScript: http://www.crockford.com/javascript/inheritance.html
fuente
Ciertamente. Hay alrededor de mil formas de implementar sistemas de clases / instancias en JavaScript. Acá hay uno:
Esa no es realmente una clase básica abstracta, por supuesto. ¿Te refieres a algo como:
fuente
fuente
No se garantiza que esto funcione como
__proto__
que no es una variable estándar, pero funciona al menos en Firefox y Safari.Si no comprende cómo funciona, lea sobre la cadena de prototipos.
fuente
setPrototypeOf
método que necesite para mi código.Puede crear clases abstractas utilizando prototipos de objetos, un ejemplo simple puede ser el siguiente:
Puede cambiar el método anterior o no, depende de usted cuando lo implemente. Para una observación detallada, puede visitar aquí .
fuente
La pregunta es bastante antigua, pero creé una posible solución sobre cómo crear una "clase" abstracta y bloquear la creación de un objeto de ese tipo.
Como puede ver, el último objeto nos da un error, es porque Animal en el prototipo tiene propiedad
abstract
. Para estar seguro de que es Animal, no algo que tengaAnimal.prototype
en la cadena de prototipos que hago:Así que verifico que mi objeto prototipo más cercano tenga la
abstract
propiedad, solo el objeto creado directamente a partir delAnimal
prototipo tendrá esta condición en verdadera. La funciónhasOwnProperty
comprueba solo las propiedades del objeto actual, no sus prototipos, por lo que esto nos da un 100% de seguridad de que la propiedad se declara aquí, no en la cadena de prototipos.En mi propuesta, no tenemos que cambiar
constructor
cada vez despuésObject.create
como está en la mejor respuesta actual de @ Jordão.La solución también permite crear muchas clases abstractas en jerarquía, solo necesitamos crear
abstract
propiedades en el prototipo.fuente
Otra cosa que puede querer hacer cumplir es asegurarse de que su clase abstracta no esté instanciada. Puede hacerlo definiendo una función que actúe como FLAG establecida como constructor de la clase Abstract. Esto luego intentará construir la BANDERA que llamará a su constructor que contiene la excepción para ser lanzada. Ejemplo a continuación:
fuente
Javascript puede tener herencia, consulte la URL a continuación:
http://www.webreference.com/js/column79/
Andrés
fuente
Podemos usar
Factory
patrón de diseño en este caso. Uso de JavaScriptprototype
para heredar los miembros de los padres.Defina el constructor de la clase padre.
Y luego crea una clase para niños.
Luego defina el constructor de la clase de niños.
Pruébalo.
Aquí está el enlace de Codepen para el código de ejemplo completo.
fuente
fuente
Creo que todas esas respuestas, especialmente las dos primeras (por algunos y jordão ) responden la pregunta claramente con el concepto convencional de JS base de prototipo.
Ahora que desea que el constructor de la clase animal se comporte de acuerdo con el parámetro pasado a la construcción, creo que esto es muy similar al comportamiento básico de,
Creational Patterns
por ejemplo, Factory Pattern .Aquí hice un pequeño enfoque para que funcione de esa manera.
fuente
Animal
constructor puede verse como un anti-patrón, una superclase no debería tener conocimiento sobre subclases. (viola Liskov y el principio de apertura / cierre)fuente
Si desea asegurarse de que sus clases base y sus miembros sean estrictamente abstractos, aquí hay una clase base que hace esto por usted:
El modo estricto hace que sea imposible registrar a la persona que llama en el método throwAbstract, pero el error debería ocurrir en un entorno de depuración que mostraría el seguimiento de la pila.
fuente