Wie nehmen Sie die Vorteile der prototypische Vererbung, ohne dass Dateien in einer bestimmten Reihenfolge schließen?

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

  •  07-07-2019
  •  | 
  •  

Frage

Wenn Sie JavaScript entwickeln, neige ich dazu, JavaScript-Code aus in verschiedene Dateien zu trennen und dann einen Skript ausführen, um die Dateien zu verketten und komprimieren oder die resultierenden Datei packen. Am Ende habe ich eine Datei, die ich brauche auf meiner Produktionsstätte zu schließen.

Dieser Ansatz in der Regel gearbeitet, aber ich habe angefangen, in ein Problem mit der Prototypenvererbung zu laufen. Insbesondere dann, wenn eine Klasse von einer anderen Klasse erbt, muss die Datei für die übergeordnete Klasse bereits enthalten sein für das Erbe zu arbeiten. Wenn die Verkettung Skript, das ich einfach bin mit einem Verzeichnis volle Dateien verketten, könnte das Kind Klasse im Code vor der Elternklasse auftreten. Wie folgt aus:

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

Der einzige Weg, dies funktioniert, ist, wenn parent_class.js vor child_class.js enthalten ist, was passieren könnte, wenn nicht die Verkettung Skript, das Kind Code vor dem übergeordneten Code platziert.

Gibt es eine Möglichkeit, diesen Code zu schreiben, so dass die Funktionalität ist die gleiche, aber die Reihenfolge, in der der Code geschrieben spielen keine Rolle mehr?

Edit: habe ich vergessen, dass ich Namespaces als auch bin mit, so dass ich fügte hinzu, dass auch auf den Code, die Dinge ein wenig ändern könnte

.
War es hilfreich?

Lösung

  

Wenn die Verkettung Skript Ich verwende einfach ein Verzeichnis vollen Dateien verketten, das Kind Klasse im Code vor der Elternklasse auftreten kann.

Ist es zu einfach eine Lösung, die eine Sortierreihenfolge Wert zu jedem Dateinamen vorangestellt wird, und nach Namen vor der Durchführung der Operation?

Beispiel:

01_parent.js
02_child.js

Ansonsten vielleicht eine vorbestellt Liste der Dateien in einer separaten Datei beibehalten wird. Vielleicht sogar noch einen Schritt weiter gehen und eine hierarchische Abhängigkeitsstruktur in XML bieten zu analysieren? Dies könnte Over-Engineering die Lösung ein wenig :-D

Einige Optionen für Möglichkeiten, um mit dem Problem zu umgehen, wenn Sie keine Möglichkeit festzustellen, haben, wie die JavaScript-Dateien geschrieben werden.

Andere Tipps

Wenn ich auf große apps gearbeitet habe, habe ich Gebrauch requireJS meinen Code in Module zu unterteilen, und stellen Sie sicher, die Module werden in der richtigen Reihenfolge geladen. Markieren Sie dann meine abgeleiteten Klasse I ebenso abhängig von der übergeordneten Klasse.

RequireJS kommt mit einem Werkzeug, das auch alle Module für Produktionsbereitstellung kombinieren und minify.

Ich nehme an, Sie etwas wirklich hackish wie dies tun könnte:

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

Dieser Code auch überall sein könnte, und würde ständig laufen, bis sowohl die Parent und die Child geladen wurden ... Aber ich würde das nicht tun.

Persönlich würde ich nur sicherstellen, dass Sie Ihre Dateien in der richtigen Reihenfolge kombiniert werden.

Wenn die Objekte „Namensraum“, dann müssen Sie entweder zu einer Build-Lösung wechseln, die in Ordnung enthält Verkettung oder verwenden Sie so etwas wie dojo.require (aber offensichtlich nicht Dojo spezifische ). Im Grunde wollen Sie einen Rahmen, der Ihnen die Möglichkeit bieten wird zu prüfen ob eine Kennung zur Verfügung und Pause Ausführung ist und ob sie (über EVALED Ajax oder einem eingesetzten Script-Tag), wenn es nicht ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top