Antecedentes rápidos: en JavaScript, la función constructora para cada tipo de objeto tiene una prototype
propiedad. El se prototype
refiere a un objeto que cada objeto construido utiliza como el siguiente paso en su cadena de prototipo. Cuando desee que un tipo sea inherente a otro tipo, puede establecer el prototype
tipo secundario en una nueva instancia del tipo primario.
Por ejemplo:
var Parent = function() { /* constructor business */ }
Parent.prototype.parentProp = "some parent property";
var Child = function() { /* constructor business */ }
Child.prototype = /*** !! Some prototype object goes here !! ***/
Mi pregunta se refiere a qué código debe ir en el " Some prototype object goes here
" lugar en el código anterior. Mi primer instinto es construir una instancia del padre (es decir, new Parent()
), pero en un comentario a una respuesta sobre ¿Es esta una forma segura de copiar un prototipo de objetos a otro? , un usuario escribe:
No, no lo use
new bar()
para el objeto prototipo.
(... que es una opinión que he visto en muchas respuestas y comentarios de SO, pero este es el único ejemplo que tengo en este momento).
La otra opción es usar Object.create(Parent.prototype)
como Child.prototype
. Hasta donde yo sé, esto también crea una nueva Parent
instancia, pero no ejecuta el Parent
constructor.
¿Alguien puede explicar por qué se debe evitar ejecutar la función de constructor al generar un objeto prototipo a partir de un tipo primario? ¿Hay algún problema técnico significativo que surja (quizás con múltiples niveles de herencia)? ¿O tal patrón es un mal uso de los constructores que choca con algunas mejores prácticas prototípicas (por ejemplo, ejecutar el constructor al crear un prototipo viola cierta separación de preocupaciones)?
fuente
Object.create
se implementa.Object.create
no funciona en IE8", que es un comentario inútil cuando puede implementarlo para este caso de uso en 2 segundos en cualquier navegador.Ahora que mi comprensión se ha ampliado un poco, me gustaría aprovechar la respuesta de Esailija con un ejemplo específico:
Una preocupación específica es que un constructor puede establecer propiedades específicas de la instancia. Por lo tanto, si usa un objeto prototipo creado con
new
, todas sus instancias secundarias podrían compartir una sola propiedad específica de instancia definida por el constructor del prototipo.Por ejemplo, supongamos que
Parent
cada instancia tiene unaid
propiedad única establecida como tiempo de construcción:Esto hará que todas las
Child
instancias compartan una únicaid
propiedad prototipo heredada del úniconew Parent()
objeto utilizado comoChild.prototype
.Un mejor enfoque para este caso es usar
Object.create
y llamar directamente al constructor padre (si es necesario) dentro del constructor hijo:fuente