2

JavaScript を開発するとき、私は JavaScript コードを別々のファイルに分割してから、スクリプトを実行してファイルを連結し、結果のファイルを圧縮またはパックする傾向があります。最後に、本番サイトに含める必要があるファイルが 1 つあります。

このアプローチは通常うまくいきましたが、プロトタイプの継承に関する問題に遭遇し始めました。具体的には、あるクラスが別のクラスから継承する場合、継承が機能するためには、親クラスのファイルが既に含まれている必要があります。私が使用している連結スクリプトがファイルでいっぱいのディレクトリを単純に連結している場合、子クラスは親クラスの前にコード内で発生する可能性があります。このような:

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

これが機能する唯一の方法は、parent_class.js が child_class.js の前に含まれている場合です。これは、連結スクリプトが親コードの前に子コードを配置する場合には発生しない可能性があります。

機能が同じになるようにこのコードを記述する方法はありますが、コードを記述する順序は重要ではありませんか?

編集:名前空間も使用していることを忘れていたので、それもコードに追加しました。これにより、少し変更される可能性があります。

4

4 に答える 4

3

大規模なアプリに取り組んだときは、requireJSを使用してコードをモジュールに分割し、それらのモジュールが正しい順序で読み込まれるようにしました。次に、派生クラスを親クラスに依存するものとしてマークします。

RequireJS には、すべてのモジュールを組み合わせて縮小し、運用環境にデプロイするためのツールも付属しています。

于 2011-04-05T01:27:14.800 に答える
2

私が使用している連結スクリプトが単にファイルでいっぱいのディレクトリを連結している場合、子クラスは親クラスの前のコードで発生する可能性があります。

各ファイル名の前に並べ替え順序の値を追加し、操作を実行する前に名前で並べ替えるのは簡単すぎる解決策ですか?

例えば:

01_parent.js
02_child.js

それ以外の場合は、事前に順序付けられたファイルのリストを別のファイルに保持することもできます。たぶん、さらに一歩進んで、解析するxmlに階層的な依存関係構造を提供しますか?これは、ソリューションを少し過剰に設計している可能性があります:-D

javascriptファイルがどのように書かれているかを判断する方法がなかった場合の問題に対処する方法のいくつかのオプション。

于 2008-11-10T22:52:07.737 に答える
0

私はあなたがこのような本当にハックなことをすることができると思います:

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

そのコードはどこにでもある可能性があり、Parentとの両方Childがロードされるまで継続的に実行されます...しかし、私はそれをしません。

個人的には、ファイルが正しい順序で結合されていることを確認します。

于 2008-11-10T23:00:07.767 に答える
0

オブジェクトが「名前空間化」されている場合は、順序連結を組み込んだビルド ソリューションに切り替えるか、dojo.requireなどを使用する必要があります(ただし、明らかに dojo 固有ではありません)。基本的に、特定の識別子が利用可能かどうかを確認し、実行を一時停止し、利用できない場合は (評価された ajax または挿入されたスクリプト タグを介して) 含める機能を提供するフレームワークが必要です。

于 2008-11-10T23:18:16.047 に答える