2011-05-12 29 views
11

在我目前的項目中,我使用的是ExtJs3.3。
我創建了許多具有私有變量和函數的類。對於如:私有函數和變量ExtJs4?

MyPanel = function(config){ 
    config = config || {}; 

    var bar = 'bar';//private variable 

    function getBar(){//public function 
    return bar; 
    } 

    function foo(){ 
    //private function 
    } 

Ext.apply(config, { 
    title: 'Panel', 
    layout: 'border', 
    id: 'myPanel', 
    closable: 'true', 
    items: [] 
}); 

    MyPanel.superclass.constructor.call(this, config); 
}; 
Ext.extend(MyPanel , Ext.Panel, { 
    bar: getBar 
}); 
Ext.reg('MyPanel', MyPanel); 

據我所知,在ExtJs4做事的新方法是使用Ext.define方法。所以作爲我上面這段代碼會是這個樣子:

Ext.define('MyPanel', { 
    extend: 'Ext.panel.Panel', 

    title: 'Panel', 
    layout: 'border', 
    closable: true, 

    constructor: function(config) { 

    this.callParent(arguments); 
    }, 

}); 

所以我想知道什麼是我該怎麼定義ExtJs4私有變量和函數類似於我在ExtJs3用同樣的方式?
換句話說,我知道Ext.define方法將負責定義,擴展和註冊我的新類,但是我應該在哪裏聲明不是類本身的屬性,而是類需要的javascript var

MyPanel = function(config){ 
    //In my Ext3.3 examples I was able to declare any javascript functions and vars here. 
    //In what way should I accomplish this in ExtJs4. 

    var store = new Ext.data.Store(); 

    function foo(){ 
    } 
    MyPanel.superclass.constructor.call(this, config); 
}; 

回答

8

我不喜歡像這樣強制執行私有變量,但當然可以做到。就在你的構造函數設置一個訪問功能(關閉)的可變/ initComponent功能:

constructor: function(config) { 
    var bar = 4; 
    this.callParent(arguments); 

    this.getBar = function() { 
     return bar; 
    } 
},... 
+0

你能在這個@Rob擴大?我在[Sencha論壇](http://www.sencha.com/forum/showthread.php?245130-Understanding-Ext-JS-4)沒有得到很多支持。我希望能找到類似於我的實現的東西(請參閱2012-05-31發佈的問題更新) - > http://stackoverflow.com/questions/9104387/extjs-javascript-module-design-pattern-best-practices – blong 2012-10-08 20:21:31

+0

嗨,我同意下面的評論,使用配置對象將是你想要什麼時使用ExtJS 4或Sencha Touch 2.該配置會自動創建內部變量和getter和setter。我稱他們爲「內部變量」,因爲他們不完全是「私人的」。在對象中挖掘時,您將能夠更改它們,但您必須付出努力:)在創建任何複雜應用程序時,我強烈建議使用Sencha MVC結構,而不是手動定義來維護可用性。祝你好運 – 2012-10-09 08:26:36

+0

這樣的事情是什麼:http://stackoverflow.com/a/6023603/320399。我試圖修改'Ext.define'來讓我在實例和實例獨有的私有成員變量之間共享私有函數。 – blong 2012-10-09 14:59:22

6

那到底是什麼配置是,從ExtJS的文檔檢查:

配置:對象 的配置選項列表與他們的默認值,爲其自動生成訪問器方法。例如:

Ext.define('SmartPhone', { 
    config: { 
     hasTouchScreen: false, 
     operatingSystem: 'Other', 
     price: 500 
    }, 
    constructor: function(cfg) { 
     this.initConfig(cfg); 
    } 
}); 

var iPhone = new SmartPhone({ 
    hasTouchScreen: true, 
    operatingSystem: 'iOS' 
}); 

iPhone.getPrice(); // 500; 
iPhone.getOperatingSystem(); // 'iOS' 
iPhone.getHasTouchScreen(); // true; 
iPhone.hasTouchScreen(); // true 

這樣你可以隱藏你的實際字段並仍然可以訪問它。

+1

這也會創建一個'apply'和一個'setter'方法。您仍然需要重寫apply方法並返回void以確保ppl不能更改該值。 – 2012-08-31 06:42:25

5

您可以創建類似這樣的私人會員。但是如果你爲這個類創建多個實例,它將不會有用。

Ext.define('MyPanel', function(){ 

    var bar = 'bar';//private variable 

    function foo(){ 
     //private function 
    }; 
    return { 
     extend: 'Ext.panel.Panel', 
     title: 'Panel', 
     layout: 'border', 
     closable: true, 

     constructor: function(config) { 

      this.callParent(arguments); 
     }, 

     getBar: function(){//public function 
      return bar; 
     } 

    }; 

}); 

謝謝你,

南渡江

+0

你的代碼中的'bar'和'foo'實際上分別是靜態變量和函數。 – Arvin 2014-08-14 10:40:26

+0

我懷疑你在函數體後缺少'()'? – Alex 2016-06-09 16:33:36