2011-07-08 2 views
4

以下の構文を使用して、プライベート変数、public &プライベート関数を持つことができます。だから、なぜ名前空間を作るためのさまざまな方法がありますか?プロトタイプの継承がすべてそれを提供する場合、なぜJavaScriptの名前空間

名前空間は、関連付けられた動作を持つ関数とは大きく異なりますか?&スコープ?

グローバルな名前空間を汚染しないという点を見ています。ウィンドウ1が作成することになり機能の過多とブラウザ内のオブジェクトが、それは同様に、以下のことにより達成することができる。..

は、私はポイントがあること..です

// Constructor for customObject 
function customObject(aArg, bArg, cArg) 
{ 
    // Instance variables are defined by this 
    this.a = aArg; 
    this.b = bArg; 
    this.c = cArg; 
} 

// private instance function 
customObject.prototype.instanceFunctionAddAll = function() 
{ 
    return (this.a + this.b + this.c); 
} 

/* 
    Create a "static" function for customObject. 
    This can be called like so : customObject.staticFunction 
*/ 
customObject.staticFunction = function() 
{ 
    console.log("Called a static function"); 
} 

// Test customObject 
var test = new customObject(10, 20, 30); 
var retVal = test.instanceFunctionAddAll(); 
customObject.staticFunction(); 
+2

ここで、コンストラクタ 'customObject2'をどこに配置しますか? Btw。 'instanceFunctionAddAll'は古典的なオブジェクト指向の意味では「プライベート」ではありません。それは外から呼び出すことができます。 –

+0

ああ、それは意味をなさない。ありがとう。 – PlanetUnknown

答えて

4

基本的なポイントを欠けているようです複数の関数があるかもしれませんが、単一の変数( "名前空間")でグローバルスコープを汚染したいだけです。

// Wrap in a immediately-executing anonymous function to avoid polluting 
// the global namespace unless we explicitly set properties of window. 
(function() { 
    function CustomObject(/*...*/) { /*...*/ } 
    // Add methods, static methods, etc. for CustomObject. 

    function CustomObject2(/*...*/) { /*...*/ } 
    // Add methods, static methods, etc. for CustomObject2. 

    var CONSTANT_KINDA = "JavaScript doesn't really have constants"; 

    // Create a namespace, explicitly polluting the global scope, 
    // that allows access to all our variables local to this anonymous function 
    window.namespace = { 
     CustomObject: CustomObject, 
     CustomObject2: CustomObject2, 
     CONSTANT_KINDA: CONSTANT_KINDA 
    }; 
}()); 

また、フェリックスは正しい、あなたの「プライベート」インスタンス関数は実際には非常に公開されています。実際のプライベートメソッドが必要な場合は、Crockford's "Private Members in JavaScript"を参照してください。

+0

ありがとうございます。私はこれをどこかに見て混乱しました。私は無名関数 - > function(){}を理解できます。しかし、構造全体は別の( - > function(){} < - ())で囲まれています。説明していただけますか? – PlanetUnknown

+2

@PlanetUnknown:これは、匿名関数をすぐに実行するために使用されます。これは、新しいスコープを作成するために使用されます。 JavaScriptには機能スコープしかありません。このように、 'CustomObject'と' CustomObject2'はグローバル名前空間を汚染せず、 'window.namespace'を介してのみアクセス可能です。それはあなたの質問に答えますか? –

+1

@PlanetUnknownその構造についての詳細なブログ記事をチェックしたい場合はhttp://benalman.com/news/2010/11/immediately-invoked-function-expression/ – Domenic

関連する問題