En PHP / Java uno puede hacer:
class Sub extends Base
{
}
Y automáticamente todos los métodos, propiedades, campos, etc. públicos / protegidos de la clase Super pasan a formar parte de la clase Sub, que se puede anular si es necesario.
¿Cuál es el equivalente de eso en Javascript?
javascript
oop
Haga clic en Upvote
fuente
fuente
Respuestas:
He cambiado la forma en que hago esto ahora, trato de evitar el uso de funciones de constructor y su
prototype
propiedad, pero mi respuesta anterior de 2010 todavía está en la parte inferior. Ahora prefieroObject.create()
.Object.create
está disponible en todos los navegadores modernos.Debo señalar que
Object.create
suele ser mucho más lento que usarlonew
con un constructor de funciones.jsfiddle
Uno de los grandes beneficios de usar Object.create es poder pasar un argumento defineProperties , lo que le brinda un control significativo sobre cómo se puede acceder y enumerar las propiedades en la clase, y también uso funciones para crear instancias, estas sirven como constructores de alguna manera, ya que puede hacer la inicialización al final en lugar de simplemente devolver la instancia.
jsfiddle
Esta es mi respuesta original de 2010:
fuente
alert()
para ver quéinstance.showColor()
devoluciones todavía obtengoundefined
. jsbin.com/uqalin/1En JavaScript no tiene clases, pero puede obtener herencia y reutilización del comportamiento de muchas maneras:
Herencia pseudo-clásica (mediante la creación de prototipos):
Debe usarse con el
new
operador:Aplicación de función o "encadenamiento de constructores":
Este enfoque también debe usarse con el
new
operador:La diferencia con el primer ejemplo es que cuando
apply
elSuper
constructor delthis
objeto dentroSub
, agrega las propiedades asignadas athis
onSuper
, directamente en la nueva instancia, por ejemplo,subInstance
contiene las propiedadesmember1
ymember2
directamente (subInstance.hasOwnProperty('member1') == true;
).En el primer ejemplo, esas propiedades se alcanzan a través de la cadena de prototipos , existen en un
[[Prototype]]
objeto interno .Herencia parasitaria o constructores de energía:
Este enfoque se basa básicamente en el "aumento de objetos", no es necesario utilizar el
new
operador y, como puede ver, lathis
palabra clave no está involucrada.ECMAScript 5th Ed.
Object.create
método:El método anterior es una técnica de herencia prototípica propuesta por Crockford .
Las instancias de objetos heredan de otras instancias de objetos, eso es todo.
Esta técnica puede ser mejor que el simple "aumento de objetos" porque las propiedades heredadas no se copian en todas las instancias de nuevos objetos, ya que el objeto base se establece como el
[[Prototype]]
del objeto extendido , en el ejemplo anteriorsubInstance
contiene físicamente solo lamember3
propiedad.fuente
Object.create()
o unaclone()
función personalizada (por ejemplo, mercurial.intuxication.org/hg/js-hacks/raw-file/tip/clone.js ) para heredar directamente del objeto prototipo; vea los comentarios en stackoverflow.com/questions/1404559/… para una explicaciónObject.create
método :)member1
variable, lo que no es deseable en absoluto. Por supuesto que pueden reescribirlo, pero eso simplemente no tiene sentido. github.com/dotnetwise/Javascript-FastClass es una mejor solución de azúcar.Sub.prototype = new Super();
. ¿Qué pasa si ambas clases nunca se van a utilizar durante la ejecución del script? Parece un problema de rendimiento. ¿Por qué necesito crear una clase principal si la clase secundaria no se usa realmente? ¿Puede explicarme por favor? Aquí está la demostración simple del problema: jsfiddle.net/slavafomin/ZeVL2 ¡Gracias!Para aquellos que acceden a esta página en 2019 o después
Con la última versión del estándar ECMAScript (ES6) , puede utilizar la palabra clave
class
.Tenga en cuenta que la definición de clase no es regular
object
; por lo tanto, no hay comas entre los miembros de la clase. Para crear una instancia de una clase, debe utilizar lanew
palabra clave. Para heredar de una clase base, useextends
:Para heredar de una clase base, use
extends
:Desde la clase derivada, puede usar super desde cualquier constructor o método para acceder a su clase base:
super().
super.getName()
,.Hay más en el uso de clases. Si desea profundizar en el tema, le recomiendo “ Clases en ECMAScript 6 ” del Dr. Axel Rauschmayer. *
fuente
fuente
class
yextends
es azúcar de sintaxis (ultra útil) para la cadena de prototipos: stackoverflow.com/a/23877420/895245Bueno, en JavaScript no hay "herencia de clases", solo hay "herencia de prototipos". Por lo tanto, no crea una clase "camión" y luego la marca como una subclase de "automóvil". En su lugar, crea un objeto "Jack" y dice que usa "John" como prototipo. Si John sabe cuánto es "4 + 4", entonces Jack también lo sabe.
Le sugiero que lea el artículo de Douglas Crockford sobre la herencia prototípica aquí: http://javascript.crockford.com/prototypal.html También muestra cómo puede hacer que JavaScript tenga una herencia "similar" como en otros lenguajes OO y luego explica que esto en realidad, significa romper javaScript de una manera que no debe usarse.
fuente
Encuentro que esta cita es la más esclarecedora:
Me gusta usar constructores en lugar de objetos, por lo que soy parcial al método de "herencia pseudoclásica" descrito aquí por CMS . A continuación, se muestra un ejemplo de herencia múltiple con una cadena de prototipos :
Aquí hay otro buen recurso de MDN , y aquí hay un jsfiddle para que pueda probarlo .
fuente
La herencia de Javascript es un poco diferente de Java y PHP, porque realmente no tiene clases. En su lugar, tiene objetos prototipo que proporcionan métodos y variables miembro. Puede encadenar esos prototipos para proporcionar herencia de objetos. El patrón más común que encontré al investigar esta pregunta se describe en Mozilla Developer Network . Actualicé su ejemplo para incluir una llamada a un método de superclase y mostrar el registro en un mensaje de alerta:
Personalmente, encuentro la herencia en Javascript incómoda, pero esta es la mejor versión que he encontrado.
fuente
no puedes (en el sentido clásico). Javascript es un lenguaje prototípico. Observará que nunca declara una "clase" en Javascript; simplemente define el estado y los métodos de un objeto. Para producir herencia, se toma un objeto y se crea un prototipo. El prototipo se amplía con nueva funcionalidad.
fuente
Puede utilizar
.inheritWith
y.fastClass
biblioteca . Es más rápido que las bibliotecas más populares y, a veces, incluso más rápido que la versión nativa.Muy fácil de usar:
Uso
fuente
fuente
Después de leer muchas publicaciones, se me ocurrió esta solución ( jsfiddle aquí ). La mayoría de las veces no necesito algo más sofisticado.
fuente
Gracias a la respuesta de CMS y después de jugar un rato con prototype y Object.create y lo que no, pude encontrar una solución ordenada para mi herencia usando apply como se muestra aquí:
fuente
Desde ES2015, así es exactamente como se hereda en JavaScript
fuente
fuente
Clases de ES6:
Javascript no tiene clases. Las clases en javascript son simplemente azúcar sintáctico construido sobre el patrón de herencia prototípico que javascript. Puede usar JS
class
para hacer cumplir la herencia de prototipos, pero es importante darse cuenta de que en realidad todavía está usando funciones de constructor bajo el capó.Estos conceptos también se aplican cuando se extiende desde una
es6
'clase' utilizando la palabra clave extiende. Esto solo crea un eslabón adicional en la cadena del prototipo. los__proto__
Ejemplo:
Object.create ()
Object.create()
también es una forma de crear herencia en JS en javascript.Object.create()
es una función que crea un nuevo objeto, y toma un objeto existente como argumento. Asignará el objeto que se recibió como argumento al__proto__
propiedad del objeto recién creado. Una vez más, es importante darse cuenta de que estamos sujetos al paradigma de herencia prototípico que encarna JS.Ejemplo:
fuente
No puede heredar de una clase en JavaScript, porque no hay clases en JavaScript.
fuente