12

ExtJS とオブジェクト指向の JavaScript 全般を学ぼうとしています。いくつかの方法でカスタム名前空間でクラスを定義している人を見てきました。これら2つの方法の違いは何ですか?

方法 1

Ext.ns('myapp.cars');
(function(){
    var Car = Ext.extend(Object, {
       //...
    })

    myapp.cars.Car = Car;
})()

方法 2

Ext.ns('myapp.cars');
myapp.cars.Car = Ext.extend(Object, {
       //...
});

方法 2 は読みやすく、必要なコードも少なくて済みます。方法1の方が優れている理由はありますか? ありがとう!

4

2 に答える 2

6

最初のメソッドの自己実行関数でプライベート変数を使用でき、2 番目のメソッドではグローバル変数しか定義できないことを除いて、基本的に同じです。

例えば:

Ext.ns('myapp.cars');
(function(){

    var carInfo = {
      goodEngine: true
    };

    var Car = Ext.extend(Object, {
       info: carInfo
    });

    myapp.cars.Car = Car;
})()

// carInfo is undefined here, so this will give an error
alert( carInfo.goodEngine );

したがって、最初の方法は、後で使用しない大量の変数を操作する場合に非常に役立ちます。

于 2010-11-07T20:16:28.997 に答える
6

以下は実質的に同等です。

var Car = Ext.extend(Object, {
   //...
});

myapp.cars.Car = Car;

... と:

myapp.cars.Car = Ext.extend(Object, {
   //...
});

最初の例では、一時変数を使用して、新しく作成されたオブジェクトへの参照を保持し、それをコピーしますmyapp.cars.Car(オブジェクトではなく、参照がコピーされます)。2 番目の例では、オブジェクトへの参照を に直接割り当てますmyapp.cars.Car

最初の例が自己呼び出し匿名関数で囲まれた理由は(function(){ })()、その一時変数のスコープを制限するためです。Carこれは一般に、その変数でグローバル名前空間を汚染しないために行われます。別の場所で定義された別の変数があった場合、このCar変数と競合することはありません。例:

var Car = "My Nice Car";

(function(){
    var Car = Ext.extend(Object, {
       //...
    });

    myapp.cars.Car = Car;
})();

alert(Car); // Still "My Nice Car"
            // No conflict with the `Car` variable in the self invoking function.
于 2010-11-07T20:18:50.043 に答える