現在、グローバル Javascript ベースの API を実行する Web アプリケーションがあり、次のように初期化されています。
var Api = {
someVar: "test",
someFunction: function() {
return "foo";
}
}
この API は、Web アプリケーションに存在する多くの「ウィジェット」間で共有され、Api
相互にデータを渡すことができるように、すべてこの単一のインスタンスから実行する必要があります。
AJAX は現在、たとえば widgets/mywidget.html でこれらのウィジェットをロードするために使用されており、たとえば次の場所に配置されています。<div id='widget_<random number>'>...</div>
コードの特定の他の部分は、 にさらに機能を追加することを選択する可能性がありApi
、現在は次のように行われています。
Api.myExtension = {
myNewFunction: function() {
return "bar";
}
}
ただし、この種の使用法では、次のような問題が発生します。
問題 1:Api = {}
1 つのウィジェット (これらはサードパーティによって提供される場合があります) が内部にコードを隠すことを決定し、すべてが存在するグローバルApi
var を破壊し、アプリケーション全体を破壊するのと同様のことを行う場合はどうなりますか? Api
この変数を外部から上書きされないように保護することはできますか? 「拡張」(新しいものの追加)のみが許可され、「削除/変更」は許可されません。すなわち:
Api.foo = { test: "bar" } // allowed
Api.someVar = "changing the existing someVar"; // not allowed
Api
たとえば、次のコードは「内部」にあります。
var Api = {
Debug: {
Messages = new Array,
Write: function() {
Api.Debug.Messages.push("test"); // allowed
}
}
}
Api.Debug.Messages.push("test 2"); // not allowed
私が考えた可能性のある解決策:
この問題を解決するために単純にフレームを使用するとします。提供される は、
Api
互いに分離されました。Api
ただし、多くの を実行している場合、何度もロードすると追加のオーバーヘッドが発生しWidget
、ウィジェットの「ホスト」(フレームが存在するページ) と通信できなくなります。たとえば、ホストに伝えたい場合があります。通知を表示するには:Api.Notify.Show("Test")
ですが、これApi
は他のインスタンスから完全に独立しており、「ホスト」と通信できないため、そうすることができませんApi の読み取りと書き込みに「ゲッター」および「セッター」関数のようなものを使用します。これを実装する方法がわからないので、これを実装する方法に関する指示についてのヘルプは大歓迎です!
1/2の混合?