Comment tirer parti de l'héritage prototypique sans avoir à inclure des fichiers dans un ordre spécifique?

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

  •  07-07-2019
  •  | 
  •  

Question

Lors du développement de JavaScript, j'ai tendance à séparer le code JavaScript en différents fichiers, puis à exécuter un script pour concaténer les fichiers et compresser ou compresser le fichier résultant. Au final, j'ai un fichier à inclure sur mon site de production.

Cette approche a généralement fonctionné, mais j'ai commencé à rencontrer des problèmes d'héritage prototypique. En particulier, si une classe hérite d'une autre classe, le fichier de la classe parent doit déjà être inclus pour que l'héritage fonctionne. Si le script de concaténation que j'utilise est simplement la concaténation d'un répertoire plein de fichiers, la classe enfant peut apparaître dans le code précédant la classe parent. Comme ceci:

parent_class.js

var Namespace = Namespace || {};    

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

classe_enfant.js

var NameSpace = Namespace || {};

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

Cela fonctionne uniquement si parent_class.js est inclus avant child_class.js, ce qui peut ne pas se produire si le script de concaténation place le code enfant avant le code parent.

Existe-t-il un moyen d'écrire ce code pour que la fonctionnalité soit la même, mais l'ordre dans lequel le code est écrit n'a plus d'importance?

Modifier: j'ai oublié d'utiliser des espaces de noms aussi, alors j'ai ajouté cela au code, ce qui pourrait changer un peu les choses.

Était-ce utile?

La solution

  

Si le script de concaténation que j'utilise est simplement un concaténage d'un répertoire plein de fichiers, la classe enfant peut apparaître dans le code précédant la classe parent.

Est-ce une solution trop simple d'ajouter une valeur d'ordre de tri à chaque nom de fichier et de trier par nom avant d'effectuer l'opération?

par exemple:

01_parent.js
02_child.js

Sinon, conservez peut-être une liste pré-ordonnée de fichiers dans un fichier séparé. Peut-être même aller plus loin et fournir une structure de dépendance hiérarchique en XML à analyser? Cela pourrait être un peu sur-ingénierie de la solution :-D

Quelques options pour résoudre le problème si vous n'aviez aucun moyen de déterminer comment les fichiers javascript sont écrits.

Autres conseils

Lorsque j'ai travaillé sur de grandes applications, j'ai utilisé requireJS pour diviser mon code en modules et vous assurer que ces modules sont chargés dans le bon ordre. Ensuite, je marque simplement ma classe dérivée en fonction de la classe parente.

RequireJS est fourni avec un outil qui combine et réduit tous vos modules pour le déploiement en production.

Je suppose que vous pourriez faire quelque chose de vraiment ridicule comme ceci:

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

Ce code pourrait également être n'importe où et continuerait à s'exécuter jusqu'à ce que le parent et le enfant soient chargés ... Mais je ne le ferais pas.

Personnellement, je voudrais simplement m'assurer que vos fichiers sont combinés dans le bon ordre.

Si les objets sont " namespaced " alors vous devez soit passer à une solution de construction qui intègre la concaténation dans l'ordre ou utiliser quelque chose comme dojo.require (mais évidemment pas spécifique au dojo). En gros, vous voulez un framework qui vous permettra de vérifier si un identifiant donné est disponible, de suspendre l'exécution et de l'inclure (via ajax évalué ou une balise de script insérée) s'il ne l'est pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top