2011-05-12 31 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