ExtJS 3:创建自定义类的两种方式:有什么区别?

12

我正在尝试学习ExtJS和面向对象的JavaScript。我看到有些人用几种方式在自定义命名空间中定义类。这两种方法有什么区别?

方法1

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更好呢?谢谢!


1
你的意思是Method 2更易于阅读且需要更少的代码吗? - fijiaaron
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 );

所以,如果您需要处理一堆后续不再使用的变量,第一种方法非常有用。

这是我最喜欢的模式实现,尽管我有一个问题... @Harmen 我有一个问题,如果我扩展一个Ext类,例如 var MyWindowClass = Ext.extend(Ext.Window, { ... });你知道我怎么使用在MyWindowClass中声明的默认配置,然后,如果我进一步扩展(即 var MySuperWindowClass = Ext.extend(myapp.MyWindowClass , { ... });),再次声明默认配置,这些默认配置将与MyWindowClass中的默认配置一起应用吗? - blong

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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接