Javascript extjs3:创建自定义类的两种方法:what';有什么区别?

Javascript extjs3:创建自定义类的两种方法:what';有什么区别?,javascript,extjs,extjs3,Javascript,Extjs,Extjs3,我试图学习ExtJS和面向对象的JavaScript。我见过人们以几种方式在自定义名称空间中定义类。这两种方法有什么区别 方法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,

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

方法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更好吗?谢谢

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

例如:

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 );

因此,如果您使用的是一堆以后不会使用的变量,那么第一种方法非常有用。

以下方法实际上是等效的:

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.

你的意思是方法2更容易阅读并且需要更少的代码吗?这是我最喜欢的模式实现,尽管我有一件事遇到了麻烦@Harmen我有一个问题,如果我在扩展一个Ext类,例如
var MyWindowClass=Ext.extend(Ext.Window,{…})
您知道如何使用
MyWindowClass
中声明的默认配置,然后,如果我进一步扩展(即
var MySuperWindowClass=Ext.extend(myapp.MyWindowClass,{…};
),请再次声明将与MyWindowClass中的默认配置一起应用的默认配置?