Javascript 私有函数和变量ExtJs4?

Javascript 私有函数和变量ExtJs4?,javascript,extjs,private-members,extjs4,Javascript,Extjs,Private Members,Extjs4,在我当前的项目中,我正在使用ExtJs3.3。 我创建了许多具有私有变量和函数的类。例如: MyPanel = function(config){ config = config || {}; var bar = 'bar';//private variable function getBar(){//public function return bar; } function foo(){ //private function } Ext.a

在我当前的项目中,我正在使用ExtJs3.3。
我创建了许多具有私有变量和函数的类。例如:

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

我不太喜欢强制执行这样的私有变量,但这当然是可以做到的。只需为构造函数/initComponent函数中的变量设置一个访问函数(闭包):

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

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

这正是config的用途,请从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

这样,您就可以隐藏实际字段并仍然可以访问它。

您可以像这样创建私有成员。但是,如果要为这个类创建多个实例,那么它就没有用了

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

    };

});
谢谢,


Nandu

这还将创建一个
apply
setter
方法。您仍然需要重写apply方法并返回void,以确保ppl无法更改该值。您可以在此@Rob上展开吗?我现在没有得到太多的支持。我希望找到与我的实现类似的东西(参见2012年5月31日的问题更新)->您好,我同意下面的评论,即使用ExtJS 4或Sencha Touch 2时,配置对象的使用将是您想要的。配置会自动创建内部变量以及getter和setter。我称它们为“内部变量”,因为它们并不完全是“私有的”。在对象中挖掘时,您将能够更改它们,但您必须付出努力:)当您创建任何复杂的应用程序时,我强烈建议使用Sencha MVC结构,而不是手动定义可维护性。好运气像这样的事情有什么好处:。我正在尝试调整
Ext.define
以提供实例之间共享的私有函数和实例特有的私有成员变量。ExtJS为私有变量提供“config”对象,为类变量提供“static”(在类实例之间共享)Hmm。。。好的,那么这是否意味着我想保持私有的任何东西都必须添加到构造函数中的
config
对象中(如果我绝对想要私有函数),并且共享函数(隐式公共)可以添加到返回对象的
statics
属性中?我正在尝试改进这一点:
bar
foo
,在您的代码中,实际上分别是静态变量和函数。我怀疑您在函数体后面缺少“()”?