に、より効率的です。 Javascriptはタイプセーフな言語ではなく、メンバの可視性に関してあまり強くありません。伝統的には、Javascript型の中で、「プライベート」、「パブリック特権」、「パブリック」可視性を持つことができます。
あなたは使用してプライベートとパブリックの特権メンバーを宣言することができます。
function FooClass()
{
var privateVar = 1;
function privateFn()
{
return privateVar; // etc...
}
this.publicVar = 2;
this.publicFn = function()
{
return privateFn();
}
}
この例では、関数が定義されている範囲の値を含む関数の宣言で構成され、関数クロージャを使用しています。これは、メンバーの可視性が必要であるがオーバーヘッドにつながる可能性がある場合に許容されます。 JavaScriptインタープリタは、外部スコープ内の変数または関数を参照するため、すべてのインスタンス化に対してprivateFnまたはpublicFnの定義を再利用することはできません。結果として、FooClassのすべてのインスタンスは、privateFnとpublicFnのための追加のストレージスペースをもたらします。タイプがまれにしか使用されない場合、または適度に使用される場合、パフォーマンスのペナルティは無視されます。型が頻繁にページで使用されている場合や、ページがアンロードされていないためにメモリーが頻繁に解放されない「AJAX」スタイルの方が多い場合、ペナルティがより目立つことがあります。
代替アプローチは、プロトタイプメンバーを使用することです。これらは、非公開の公的メンバーです。 Javascriptは完全に型セーフではなく、ロード後に比較的簡単に変更できるため、型の安全性とメンバの可視性は、型の内部へのアクセスを制御するための信頼性がありません。パフォーマンス上の理由から、ASP.NET Ajaxのようなフレームワークではなく、メンバの名前付けを使用して可視性ルールを推論します。たとえば、ASP.NET Ajaxの内の同じタイプは次のようになります。
function FooClass2()
{
this._privateVar = 1;
this.publicVar = 2;
}
FooClass2.prototype =
{
_privateFn : function()
{
return this._privateVar;
},
publicFn : function()
{
return this._privateFn();
}
}
FooClass2.registerClass("FooClass2");
をプライベートスコープのメンバーは、名前だけでプライベートなこの場合は、「_」プレフィックスは、プライベートメンバ変数を意味すると考えられています。メンバが本当にプライベートになるのを防ぐという欠点がありますが、オブジェクトのメモリ内のパッチ適用が可能です。もう1つの主な利点は、すべての関数がインタープリタとエンジンによって一度作成され、型に対して何度も再利用されることです。関数参照自体が同じであっても、 "this"キーワードは型のインスタンスを参照します。アクションの違いを見るために
一つの方法は、
var fooA = new FooClass(), fooB = new FooClass();
alert(fooA.publicFn===fooB.publicFn); // false
var foo2A = new FooClass2(), foo2B = new FooClass2();
alert(foo2A.publicFn===foo2B.publicFn); // true
(あなたはASP.NET AJAXを持っていない場合、あなたは()registerClassを呼び出すFooClass2の最後の行を無視することができます)両方のタイプでこれを試してみることです
そのタイプの安全性とメンバーの可視性の問題パフォーマンスとメモリへのパッチ適用能力
あなたFooClassの例が正しくありません。 newのセマンティクスは事実上有効です: "var foo = {}; foo .__ proto__ = FooClass.prototype; var temp = FooClass.call(temp); if(IsObject(temp))foo = temp;"つまり、あなたの例では、fooは新しいオブジェクト "{reallypublicfn:function(){...}}"になりますので、FooClassプロトタイプやpublicfn関数はありません – olliej