JavaScriptシミュレーションネーミングスペース
3488 ワード
JavaScriptシミュレーションネーミングスペース
C++とC#では、名前の競合を最小限に抑えるためにネーミングスペースが使用されます.例えば、.NET Frameworkでは、名前空間がMicrosoftを助ける.Build.Task.MessageクラスとSystem.Messaging.Messageで区切る.JavaScriptにはネーミングスペースをサポートする特定の言語機能はありませんが、オブジェクトを使用してネーミングスペースをシミュレートするのは簡単です.JavaScriptライブラリを作成する場合は、次のようにグローバル関数やクラスを定義することなく、ネーミングスペースにパッケージできます.
ネーミングスペースの1つのレベルは一意ではない場合があります.したがって、ネストされたネーミングスペースを作成できます.
これらの冗長なネストされたネーミングスペースを入力すると疲れることが想像できます.幸いなことに、ライブラリ・ユーザーは、より短い別名をネーミング・スペースに簡単に指定できます.
Microsoft Ajaxライブラリのソースコードを見ると、ライブラリの著者らは同様の技術を使用してネーミングスペースを実装していることがわかります(静的メソッドType.registerNamespaceの実装を参照).
OOPとASP.NET AJAX
ASP.NET AJAXで実装OOPは,本明細書で議論する仕様実装とは若干異なるが,主に2つの理由がある:ASP.NET AJAXバージョンでは、xmlスクリプトなどの宣言構文やパラメータ検証に必要な反射の可能性が向上し、ASP.NET AJAXのターゲットは、.NETを使用する開発者によく知られている他の構造(属、イベント、列挙、インタフェースなど)をJavaScriptに変換することです.
JavaScriptで現在広く使用されているバージョンでは不足しています.NET開発者がよく知っているいくつかのOOPの重要な概念は、ASP.NET AJAXはそのほとんどをシミュレートできる.
命名規則(遵守する例)に従って、クラスにはプロパティ・アクセサ、マルチキャスト・イベントがあります.(.NETによって提供された約定を緊密に反映するモードに適合する).プライベート変数はメンバーの下線の先頭にあるプライベートな約定を遵守する.これらの変数をデバッガが監視できるようにするための本格的なプライベート変数を使用する機会は少ない.インタフェースを導入することも、タイプチェックが一般的なアヒルの定型化を回避するための方法である(アヒルのように歩く物体や鳴き声がある場合は、アヒルであるか、少なくともアヒルと見なすことができるという概念に基づいたタイプのスキーム.
クラスと反射
JavaScriptでは、関数の名前を知ることができません.これが可能であっても、クラス構築関数は通常、ネーミング空間変数に匿名関数を割り当てることによって構築されるため、ほとんどの場合は何の役にも立たない.実際にタイプ名を構成するのは、この変数の完全な限定名であり、同様にアクセスできず、コンストラクション関数自体が何も知らない.この制限を回避し、JavaScriptクラスを豊富に反射させるため、ASP.NET AJAXはタイプ名を登録する必要があります.
ASP.NET AJAXで反射されたAPIは、組み込みタイプ、クラス、インタフェース、ネーミングスペース、または列挙にかかわらず、すべてのタイプをチェックします.NET Frameworkのような関数が含まれています.(isInstanceOfTypeやinheritsFromなど)実行時にクラスの階層をチェックすることができます.ASP.NET AJAXはデバッグモードでいくつかのタイプのチェックを実行するので、開発者がより早くBugをキャプチャするのに役立ちます.
クラス階層の登録と呼び出しの基礎関数
ASP.でNET AJAXでクラスを定義するには、そのコンストラクション関数を変数に割り当てる必要があります(コンストラクション関数が列挙関数を呼び出す方法に注意してください):
次のセクション:このようにJavaScriptコードを書くべきですか?
C++とC#では、名前の競合を最小限に抑えるためにネーミングスペースが使用されます.例えば、.NET Frameworkでは、名前空間がMicrosoftを助ける.Build.Task.MessageクラスとSystem.Messaging.Messageで区切る.JavaScriptにはネーミングスペースをサポートする特定の言語機能はありませんが、オブジェクトを使用してネーミングスペースをシミュレートするのは簡単です.JavaScriptライブラリを作成する場合は、次のようにグローバル関数やクラスを定義することなく、ネーミングスペースにパッケージできます.
var MSDNMagNS.Pet = function(name)
{
// code here;
};
MSDNMagNs.Pet.prototype.toString = function()
{
// code
};
var pet = new MSDNMagNS.Pet("Yammer");
ネーミングスペースの1つのレベルは一意ではない場合があります.したがって、ネストされたネーミングスペースを作成できます.
var MSDNMagNS = {};
// nested namespace "Examples"
MSDNMagNS.Examples = {};
MSDNMagNS.Examples.Pet = function(name)
{
// code
};
MSDNMagNS.Examples.Pet.prototype.toString = function()
{
// code
};
var pet = new MSDNMagNS.Examples.Pet("Yammer");
これらの冗長なネストされたネーミングスペースを入力すると疲れることが想像できます.幸いなことに、ライブラリ・ユーザーは、より短い別名をネーミング・スペースに簡単に指定できます.
// MSDNMagNS.Examples and Pet definition...
// think "using Eg = MSDNMagNS.Examples;"
var Eg = MSDNMagNS.Examples;
var pet = new Eg.Pet("Yammer");
alert(pet);
Microsoft Ajaxライブラリのソースコードを見ると、ライブラリの著者らは同様の技術を使用してネーミングスペースを実装していることがわかります(静的メソッドType.registerNamespaceの実装を参照).
OOPとASP.NET AJAX
ASP.NET AJAXで実装OOPは,本明細書で議論する仕様実装とは若干異なるが,主に2つの理由がある:ASP.NET AJAXバージョンでは、xmlスクリプトなどの宣言構文やパラメータ検証に必要な反射の可能性が向上し、ASP.NET AJAXのターゲットは、.NETを使用する開発者によく知られている他の構造(属、イベント、列挙、インタフェースなど)をJavaScriptに変換することです.
JavaScriptで現在広く使用されているバージョンでは不足しています.NET開発者がよく知っているいくつかのOOPの重要な概念は、ASP.NET AJAXはそのほとんどをシミュレートできる.
命名規則(遵守する例)に従って、クラスにはプロパティ・アクセサ、マルチキャスト・イベントがあります.(.NETによって提供された約定を緊密に反映するモードに適合する).プライベート変数はメンバーの下線の先頭にあるプライベートな約定を遵守する.これらの変数をデバッガが監視できるようにするための本格的なプライベート変数を使用する機会は少ない.インタフェースを導入することも、タイプチェックが一般的なアヒルの定型化を回避するための方法である(アヒルのように歩く物体や鳴き声がある場合は、アヒルであるか、少なくともアヒルと見なすことができるという概念に基づいたタイプのスキーム.
クラスと反射
JavaScriptでは、関数の名前を知ることができません.これが可能であっても、クラス構築関数は通常、ネーミング空間変数に匿名関数を割り当てることによって構築されるため、ほとんどの場合は何の役にも立たない.実際にタイプ名を構成するのは、この変数の完全な限定名であり、同様にアクセスできず、コンストラクション関数自体が何も知らない.この制限を回避し、JavaScriptクラスを豊富に反射させるため、ASP.NET AJAXはタイプ名を登録する必要があります.
ASP.NET AJAXで反射されたAPIは、組み込みタイプ、クラス、インタフェース、ネーミングスペース、または列挙にかかわらず、すべてのタイプをチェックします.NET Frameworkのような関数が含まれています.(isInstanceOfTypeやinheritsFromなど)実行時にクラスの階層をチェックすることができます.ASP.NET AJAXはデバッグモードでいくつかのタイプのチェックを実行するので、開発者がより早くBugをキャプチャするのに役立ちます.
クラス階層の登録と呼び出しの基礎関数
ASP.でNET AJAXでクラスを定義するには、そのコンストラクション関数を変数に割り当てる必要があります(コンストラクション関数が列挙関数を呼び出す方法に注意してください):
MyNamespace.MyClass = function()
{
MyNamespace.MyClass.initializeBase(this);
this._myProperty = null;
}
Then, you need to define the class members itself in its prototype:
MyNamespace.MyClass.prototype =
{
get_myProperty:function()
{
return this._myProperty;
},
set_myProperty:function(value)
{
this._myProperty = value;
},
doSomething: function()
{
MyNamespace.MyClass.callBaseMethod(this,"doSomething");
/* do something more */
}
}
:
MyNamespace.MyClass.registerClass("MyNamespace.MyClass", MyNamespace.BaseClass);
, registerClass 。
Bertrand Le Roy ASP.NET AJAX II。
次のセクション:このようにJavaScriptコードを書くべきですか?