12

我正在尝试学习 ExtJS 和一般的面向对象的 JavaScript。我见过人们以几种方式在自定义命名空间中定义类。这两种方法有什么区别?

方法一

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

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

方法二

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

方法2更容易阅读,需要的代码更少;有什么理由方法1更好吗?谢谢!

4

2 回答 2

6

基本相同,只是第一种方法的自执行函数中可以使用私有变量,而第二种方法只能定义全局变量。

例如:

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(复制的是引用,而不是对象)。在第二个示例中,您将对对象的引用直接分配给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 回答