¿Cómo se aprovecha la herencia de prototipos sin necesidad de incluir archivos en un orden específico?

StackOverflow https://stackoverflow.com/questions/279391

  •  07-07-2019
  •  | 
  •  

Pregunta

Cuando desarrollo JavaScript, tiendo a separar el código JavaScript en diferentes archivos y luego ejecuto un script para concatenar los archivos y comprimir o empacar el archivo resultante. Al final, tengo un archivo que necesito incluir en mi sitio de producción.

Este enfoque generalmente ha funcionado, pero he comenzado a tener problemas con la herencia de prototipos. Específicamente, si una clase hereda de otra clase, el archivo de la clase padre ya debe estar incluido para que la herencia funcione. Si el script de concatenación que estoy usando simplemente concatena un directorio lleno de archivos, la clase secundaria puede aparecer en el código antes que la clase principal. Así:

parent_class.js

var Namespace = Namespace || {};    

Namespace.Parent = function () { };
Namespace.Parent.prototype.doStuff = function () { ... };

child_class.js

var NameSpace = Namespace || {};

Namespace.Child = function () { ... };
Namespace.Child.prototype = new Namespace.Parent();

La única forma en que esto funciona es si se incluye parent_class.js antes de child_class.js, lo que podría no ocurrir si el script de concatenación coloca el código hijo antes que el código padre.

¿Hay alguna manera de escribir este código para que la funcionalidad sea la misma, pero el orden en que se escribe el código ya no importa?

Editar: olvidé que también estoy usando espacios de nombres, así que también lo agregué al código, lo que podría cambiar un poco las cosas.

¿Fue útil?

Solución

  

Si el script de concatenación que estoy usando simplemente concatena un directorio lleno de archivos, la clase secundaria puede aparecer en el código antes que la clase principal.

¿Es una solución demasiado simple anteponer un valor de orden de clasificación a cada nombre de archivo y ordenar por nombre antes de realizar la operación?

por ejemplo:

01_parent.js
02_child.js

De lo contrario, tal vez mantener una lista de archivos preordenados en un archivo separado. ¿Quizás incluso ir un paso más allá y proporcionar una estructura de dependencia jerárquica en xml para analizar? Esto podría estar sobregeniando un poco la solución :-D

Algunas opciones para tratar el problema si no tenía forma de determinar cómo se escriben los archivos javascript.

Otros consejos

Cuando he trabajado en aplicaciones grandes, uso requireJS para dividir mi código en módulos y asegurarme de que esos módulos se cargan en el orden correcto. Luego, marco mi clase derivada como dependiente de la clase principal.

RequireJS viene con una herramienta que combinará y minimizará todos sus módulos para la implementación de producción también.

Supongo que podrías hacer algo realmente hackeo como este:

setTimeout(function() { 
  if(typeof(Parent) != "undefined" && typeof(Child) != "undefined") { 
    Child.prototype = new Parent(); 
  } else {
    setTimeout(arguments.callee, 50);
  }
}, 50);

Ese código también podría estar en cualquier lugar, y se ejecutaría continuamente hasta que tanto el Parent como el Child se cargaran ... Pero yo no haría eso.

Personalmente, solo me aseguraría de que sus archivos se combinen en el orden correcto.

Si los objetos tienen espacios de nombres " entonces debe cambiar a una solución de compilación que incorpore concatenación en orden o usar algo como dojo.require (pero obviamente no es un dojo específico). Básicamente, desea un marco que le brinde la capacidad de verificar si un identificador determinado está disponible y pausar la ejecución e incluirlo (a través de ajax evadido o una etiqueta de script insertada) si no lo está.

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