Ext JS 4 老特征:statics 静态的变量和方法

l   一、静态的变量和静态的方法 【译文原创Learning Ext JS 4 第51页】

Statics的方法只属于类本身,而不属于任何一个实例,这就决定了我们是在定义类的内部来用statics方法的,而不是在某个实例中。

现在,我要建立一个在银行排队叫号的类,排队的人就象是在流水线上一样,每个人都有一个不重复的顺序号,代码如下。    

//定义一个客户类,只需要顺序号,别的什么也不需要。

Ext.define('MyApp.data.Client',{

statics        : {                                  //1

                                                   sequence   : 0,

                                                   nextId                  : function(){                                                                         

                                          return   ++this.sequence;                                                                                                       

                }

                                 },

//使用构造函数,创建1个实例就加1。//第2步.

constructor : function(){

this.id=              this.self.nextId();         //去调用类本身的静态方法,做加1处理

//console.log(this.id);

}

});

  //begin,因为静态属于类,学习直接使用类名本身调用静态的变量和静态的方法。

Ext.create('MyApp.data.Client');

console.log(MyApp.data.Client.sequence+' 号产生了!');

Ext.create('MyApp.data.Client');

console.log(MyApp.data.Client.sequence+' 号产生了!');

Ext.create('MyApp.data.Client');

console.log(MyApp.data.Client.sequence+' 号产生了!');

console.log(MyApp.data.Client.nextId()+' 号意外的产生了,这是直接使用了类本身来调用自己的静态方法,而有产生某个实例人,可以肯定这是个假号!');

代码完毕,执行结果如下:

      Ext JS 4 老特征:statics 静态的变量和方法

•       第1步:我们在类定义内使用了statics静态,这将决定着这个类在创建实例的时候将会启用statics预处理机制。我们已经建立了sequence顺序号属性和nextId方法,这2个将打上statics标志添加到类中,而且,还可以根据你的需要随意的添加。

•       第2步:在类定义中,我们使用了self指针来访问类,Ext对于每一个实例的static内部预处理机制中都建立了这个指针。

使用这样的方式来调用静态类型的变量:

MyApp.data.Client

使用下面这样的方式来调用静态方法。

MyApp.data.Client.nextId();

二、statics 静态的深入理解【译文原创Ext.JS.4.First.Look 第26页】

在Ext JS 4中,任何一个类都可以建立静态的方法,这样做的好处就是直接使用该类名本身来调用方法而不象以前那样创建实例然后再用实例去调用某个方法,调用方式为:

类名.静态变量名。或者:类名.静态方法名,例子:MyApp.Math.count或者MyApp.Math.sum(10,5)

静态的变量和静态的方法定义,代码如下,

 Ext.define('MyApp.Math',{

                 statics    : {
count : ,
appname : '数学',
sum : function(number1,number2){
return number1+number2; }
},
//使用构造函数,创建1个实例就加1,好明白有多少个实例。
constructor : function(){
++this.statics().count;
//console.log(this.statics().count);
}
});

这个类包含了2个静态的变量属性---count和appName,根据第1段的理解我们在没有创建任何实例的情况下就可以直接使用它,

如下直接调用变量:

MyApp.Math.count

MyApp.Math.appname

可以这样:MyApp.Math.sum(10,5)来直接调用静态方法。

现在, 看一下在statics括弧之外是如何调用的,以构造函数为例子,这就需要使用this.statics()该种方式来访问了,this.statics().count,当你使用this.self.属性名 这种格式,能否调用取决于你所指向的实例。

题后话:下面我们来看一下statics有了在继承的情况,有了子类会怎样:

一句话,statics有了子类的情况,情况就发生了严重变异,公共的静态就不在是公共的了。明白的说,静态的count到了子类就不再是公共类型了,静态的方法sum()也就不再是公共的了sum()了。我们在子类中就再也不能使用MyApp.Math2.count或MyApp.Math2.sum(5,0),

寻找答案?

      用statics的静态成员和方法有了子类后,在子类中的静态成员和方法到底变成了什么类型?谢谢

上一篇:【Android】Android实现自定义带文字和图片的Button


下一篇:【转】【Raspberry Pi】Unix NetWork Programming:配置unp.h头文件环境