Come sfruttare l'eredità prototipale senza la necessità di includere i file in un ordine specifico?

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

  •  07-07-2019
  •  | 
  •  

Domanda

Durante lo sviluppo di JavaScript, tendo a separare il codice JavaScript in diversi file e quindi eseguire uno script per concatenare i file e comprimere o comprimere il file risultante. Alla fine, ho un file che devo includere nel mio sito di produzione.

Questo approccio di solito ha funzionato, ma ho iniziato a riscontrare problemi con l'eredità prototipale. In particolare, se una classe eredita da un'altra classe, il file per la classe genitore deve essere già incluso affinché l'ereditarietà funzioni. Se lo script di concatenazione che sto utilizzando sta semplicemente concatenando una directory piena di file, la classe figlio potrebbe essere presente nel codice prima della classe genitore. In questo modo:

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();

L'unico modo in cui funziona è se parent_class.js è incluso prima di child_class.js, il che potrebbe non accadere se lo script di concatenazione posiziona il codice figlio prima del codice padre.

C'è un modo per scrivere questo codice in modo che la funzionalità sia la stessa, ma l'ordine in cui è scritto il codice non ha più importanza?

Modifica: ho dimenticato che sto usando anche spazi dei nomi, quindi l'ho aggiunto anche al codice, il che potrebbe cambiare un po 'le cose.

È stato utile?

Soluzione

  

Se lo script di concatenazione che sto usando sta semplicemente concatenando una directory piena di file, la classe figlio potrebbe trovarsi nel codice prima della classe genitore.

È troppo semplice una soluzione per anteporre un valore di ordinamento a ciascun nome file e ordinarlo per nome prima di eseguire l'operazione?

es:

01_parent.js
02_child.js

Altrimenti, forse mantenendo un elenco preordinato di file in un file separato. Forse fare un ulteriore passo avanti e fornire una struttura gerarchica di dipendenza in XML per analizzare? Questo potrebbe ingigantire un po 'la soluzione :-D

Alcune opzioni su come affrontare il problema se non avessi modo di determinare come sono scritti i file javascript.

Altri suggerimenti

Quando ho lavorato su app di grandi dimensioni, ho usato requireJS per dividere il mio codice in moduli e assicurarmi quei moduli sono caricati nell'ordine corretto. Quindi segnare semplicemente la mia classe derivata come dipendente dalla classe genitore.

RequireJS viene fornito con uno strumento che combina e minimizza anche tutti i moduli per l'implementazione della produzione.

Suppongo che potresti fare qualcosa di veramente hacker come questo:

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

Quel codice potrebbe anche essere ovunque, e funzionerebbe continuamente fino a quando sia Parent che Child fossero caricati ... Ma non lo farei.

Personalmente, vorrei solo assicurarmi che i tuoi file siano combinati nell'ordine corretto.

Se gli oggetti sono " spazio dei nomi " quindi devi passare a una soluzione di build che incorpora la concatenazione in ordine o utilizzare qualcosa come dojo.require (ma ovviamente non specifico per dojo). Fondamentalmente vuoi un framework che ti darà la possibilità di verificare se un determinato identificatore è disponibile e mettere in pausa l'esecuzione e includerlo (tramite ajax valutato o un tag di script inserito) se non lo è.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top