3

私は JavaScript の初心者で、名前空間の次のスキームを考え出しました。

(function() {
    var ns = Company.namespace("Company.Site.Module");

    ns.MyClass = function() { .... };

    ns.MyClass.prototype.coolFunction = function() { ... };

})();

Company.namespace は、Module までのオブジェクトのチェーンを単純に作成するスクリプトによって登録される関数です。

外部、非グローバル スコープ:

var my = new Company.Site.Module.MyClass();

私は特に、変数nsをグローバルスコープから隠す方法について質問しています-すぐに実行されるラッピング匿名関数によって。どこにでも書き込むことができますCompany.Site.Moduleが、ローカル変数に ns を格納するのに比べて、DRY ではなく、少し面倒です。

何て言う?このアプローチにはどのような落とし穴がありますか? より標準と見なされる他の方法はありますか?

4

2 に答える 2

1

そのようなクラスのスコープを設定する必要はありません。クラスの外部にグローバル変数がある場合にのみ必要です。私はこのアプローチを使用しています...

MyApp.MyClass = function() {
};

MyApp.MyClass.prototype = {
   foo: function() {
   }
};

また、よりクリーンなプロトタイプ宣言にオブジェクト リテラルを使用していることにも注意してください。

ただし、グローバル変数のスコープが必要な場合は、次のことができます

(function() {
   var scopedGlobalVariable = "some value";

   MyApp.MyClass = function() {
   };
   MyApp.MyClass.prototype = function() {
       foo: function() {
       }
   };
})();
于 2012-07-10T14:52:06.580 に答える
1

あなたのアプローチは私にはうまく見えます。

ただし、自己実行関数から「クラス」を返すことにより、これを少し異なる方法で行うこともできます。

Company.Site.Module.MyClass = (function() {
    var MyClass = function() { ... };
    MyClass.prototype.foo = function() { ... };
    return MyClass;
})();

これにより、少なくともすべてのns.プレフィックスが削除されます。名前空間関数を使用してオブジェクトを作成することはできますが、自己実行関数の範囲外です。

于 2012-07-04T08:31:13.380 に答える