ST2 采用跟Ext JS 4一样的类系统。这使得我们可以很轻松地在JavaScript中创建或继承新的类。类系统提供了继承,依赖加载,mixin,强大的配置选项等内容。
简单来说,类是一个拥有一些属性和方法的对象。例如:定义一个动物类,定义其名称和功能,使得它能说话,我们只需这样做:
1
2
3
4
5
6
7
8
9
|
Ext.define(
'Animal'
, {
config: {
name:
null
},
speak:
function
() {
alert(
'grunt'
);
}
});
|
这样我们就定义了一个动物类,每个动物可以有一个名称,并可以说话。要创建一个新的的动物,我们只需这样:
1
2
3
4
|
var
bob = Ext.create(
'Animal'
, {
name:
'Bob'
});
bob.speak();
//alerts 'grunt'
|
在这里,我们创建了一个名为Bob的动物,并命令它说话。现在,我们已经定义了一个类和并创建了一个实例,但我们不知道鲍勃是什么物种,所以让我们定义一个人类的作为动物类的子类:
1
2
3
4
5
6
7
|
Ext.define(
'Human'
, {
extend:
'Animal'
,
speak:
function
() {
alert(
this
.getName());
}
});
|
现在我们已经从动物类继承了一个新的的人类,因此人类获得其所有的方法和配置。实际上,我们重写了说话的方法,因为大多数人有足够的智慧,说他们的名字,而不是咕噜咕噜地叫。现在,我们创建一个名为Bob的人,并让他说话:
1
2
3
4
5
|
var
bob = Ext.create(
'Human'
, {
name:
'Bob'
});
bob.speak();
//alerts 'Bob'
|
你应该也注意到了上面的代码中使用了getName方法,然而我们并没有定义动物类的getName方法。那它来自哪里?答案是:框架自动帮每一个配置项添加了以下方法:
getter和setter都是自动生成的,建议大家使用它们来存取类里面的数据。ST的每一个组件都使用了getter和setter的模式,这意味着如果我们知道一个配置项,也就知道如何获取和设置它的值了。
这也让你的的代码更整洁。举个例子:如果你想在改变Bob的名字时询问用户。就可以定义applyName方法,它会被自动调用:
1
2
3
4
5
6
7
|
Ext.define(
'Human'
, {
extend:
'Animal'
,
applyName:
function
(newName, oldName) {
return
confirm(
'Are you sure you want to change name to '
+ newName +
'?'
);
}
});
|
我们用浏览器内建的confirm方法弹出了一个确认操作的对话框。如果applier方法返回的是false,那name的值将不会发生改变。
1
2
3
4
5
6
7
8
9
|
var
bob = Ext.create(
'Person'
, {
name:
'Bob'
});
bob.setName(
'Fred'
);
//opens a confirm box, but we click No
bob.speak();
//still alerts 'Bob'
我们已经学习了类系统的这些内容:
|
现在,你已经学会如何定义和使用一个类。但类系统的内容远远不只这些。
大多数时候,类之间都存在着依赖。我们可以使用"requires"关键字来引入一个被依赖的类。人类依赖动物类并扩展动物类,这种情况下并不需要特殊的说明,用"extend"就已经表明了这种依赖关系。
1
2
3
4
5
6
7
8
9
|
Ext.define(
'Human'
, {
extend:
'Animal'
,
requires:
'Ext.MessageBox'
,
speak:
function
() {
Ext.Msg.alert()
}
});
|
当你像这样定义一个类的时候,ST就会检查并异步加载Ext.MessageBox。
Ext.MessageBox也可能依赖于其他类,这些类也将在后台自动加载。Ext.MessageBox和动物类都加载完毕后,就会定义人类。然后就可以使用Ext.create实例化"人"了。
在开发过程中,多文件可以让我们有效地管理代码,但应用发布后,应该尽量减少文件的数目以提高网络响应速度。ST2的JSBuilder工具可以分析你的应用程序,并将你所有代码连同你所用到的ST中的类合并成一个js文件。关于JSBuilder使用方法的介绍,请看指南的第二部分。
每种方法都有其自身的利弊,我们是否能够取其精华,去其糟粕?答案是肯定的,在ST2里,我们已经实现了这一目标。
使用统一的风格来命名类、名空间和文件名有助于更好地组织代码,保证代码的条理性和可读性。
类名只能由字符和数字组成。不要在类名中出现数字,除非它属于一个技术术语。不要使用下划线,连字符,以及任何字母数字以外的字符。例如:
每个类都要有命名空间。用"."来为类分配命名空间,把类分配到不同的包内。例如:
非框架本身的类,不要使用Ext作为顶级命名空间。
首字母缩略词也应该遵循上面列出的骆驼拼写法约定。例如:
类名直接映射到类文件的存储路径。因此,每个文件对应一个类(就像java一样)例如: