代码之家  ›  专栏  ›  技术社区  ›  clint

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

  •  12
  • clint  · 技术社区  · 15 年前

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

    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更好有什么原因吗?谢谢!

    2 回复  |  直到 14 年前
        1
  •  6
  •   Harmen    15 年前

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

    例如:

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

        2
  •  6
  •   Daniel Vassallo    15 年前

    以下内容实际上相当于:

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

    ... 以及:

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

    在第一个示例中,您将使用一个临时变量来保存对新创建的对象的引用,然后将其复制到 myapp.cars.Car 我的app.cars.Car .

    第一个示例包含在自调用匿名函数中的原因 (function(){ })() 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.