Pregunta

Veo muchos códigos como este:

function Base() {}
function Sub() {}
Sub.prototype = new Base();

Sin embargo, si lo haces:

s = new Sub();
print(s.constructor == Sub);

Esto es falso. Esto me parece confuso, ya que el constructor de s es, de hecho, Sub. ¿Es convencional / mejor hacer esto?

function Base() {}
function Sub() {}
Sub.prototype = new Base();
Sub.prototype.constructor = Sub;

¿O realmente no importa?

¿Fue útil?

Solución

'constructor' no hace lo que parece que hace. Esto, además de su falta de estandarización, es una buena razón para evitar su uso: apéguese a instanceof y prototipo.

Técnicamente: 'constructor' no es una propiedad de la instancia de 's', es una propiedad del objeto prototipo 'Sub' que se muestra a través. Cuando creas la función 'Sub' en Mozilla, obtienes un objeto Sub.prototype predeterminado recién acuñado que tiene un 'constructor' apuntando a la función Sub como una cortesía.

Sin embargo, luego reemplaza ese prototipo con una nueva Base (). El prototipo predeterminado original con el enlace de regreso a Sub se pierde; en su lugar, Sub.prototype es una instancia de Base sin ninguna propiedad de "constructor" de reemplazo. Entonces:

new Sub().constructor===
Sub.prototype.constructor===
new Base().constructor===
Base.prototype.constructor===
Base

... hasta el objeto más básico cuyo prototipo no hayas cambiado.

  

¿Es convencional / mejor hacer esto?

Cuando se trata de objetos / clases de JavaScript no hay una convención; El sistema de metaclase de cada biblioteca se comporta de manera ligeramente diferente. No he visto uno que escriba 'constructor' en cada clase derivada manualmente, pero parece una solución tan buena como cualquiera si realmente desea tener el constructor real disponible; también hará que el código sea compatible con los navegadores / motores que no te dan 'constructor'.

Sin embargo, consideraría darle un nombre diferente para evitar confusiones con la propiedad 'constructor' existente y de comportamiento diferente.

Otros consejos

Si desea probar si un objeto es exactamente una instancia de Sub use el operador instanceof : -

print(s instanceof Sub);

Si desea saber si un objeto es una instancia de Sub o una instancia de una subclase de Sub, use el método isPrototypeOf : -

print(Sub.prototype.isPrototypeOf(s));

Sí,

Sub.prototype.constructor = Sub;

te permite usar instanceof pero hay una mejor solución. Mire aquí: TDD JS Herencia en GitHub , y busque Patrón de herencia combinada parásita . El código es TDD, por lo que debería poder asimilarlo muy rápidamente y luego simplemente cambiar los nombres para comenzar. Esto es básicamente lo que usa YAHOO.lang.extend (fuente: el empleado y el autor profesional de Nicholas Zakas de yahoo, Nicholas Zakas para el desarrollador web, 2ª ED, página 181). Buen libro por cierto (¡no está afiliado de ninguna manera!)

¿Por qué? Debido a que el patrón clásico con el que está trabajando tiene vars de referencia estáticos (si crea var arr = [1,2] en el objeto base, TODAS las instancias tendrán lectura / escritura y compartirán el estado "¡¡¡de 'arr'! Si utiliza el robo de constructor que puede sortear esto. Vea mis ejemplos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top