类管理体系-Class System
命名规范-Naming Conventions
类-Classes
类名称只允许使用字母和数字(alphanumeric)。虽然允许使用数字,但是不建议使用,除非属于专有的技术术语。不要使用下划线、分隔符以及其他非字母和数字的字符。
MyCompany.useful_util.Debug_Toolbar Bad
MyCompany.util.Base64 Good
类名称应该使用命名空间和包进行分组区隔,应该只有一个最顶层的命名空间,例如:
MyCompany.data.CoolProxy
MyCompany.Application
命名空间和类名应该使用驼峰命名(CamelCased),其他的包名应该使用小写(lower-cased),例如:
MyCompany.form.action.AutoLoad
不是Sencha发布的类,不要使用Ext命名空间。首字母缩略词也应该遵循 CamelCased 样式,例如:
Ext.data.JsonProxy 替代 Ext.data.JSONProxy
MyCompany.util.HtmlParser 替代 MyCompary.parser.HTMLParser
MyCompany.server.Http 替代 MyCompany.server.HTTP
源文件-Source Files
类的名称直接映射到类文件的存储路径,所以每个类必须用单独一个文件来定义,例如:
Ext.util.Observable 存储在 path/to/src/Ext/util/Observable.js
Ext.form.action.Submit 存储在 path/to/src/Ext/form/action/Submit.js
MyCompany.chart.axis.Numeric 存储在 path/to/src/MyCompany/chart/axis/Numeric.js
path/to/src
是应用程序类的存储目录,所有类都应该存储在这个公共目录下。
方法和变量-Methods and Variables
- 与类的命名一致,方法和变量的名称只允许使用字母和数字(alphanumeric)。虽然允许使用数字,但是不建议使用,除非属于专有的技术术语。不要使用下划线、分隔符以及其他非字母和数字的字符。
- 方法和变量名应使用驼峰命名(camelCased),首字母缩略词(acronyms)也一样。
# Acceptable method names:
encodeUsingMd5()
getHtml() instead of getHTML()
getJsonResponse() instead of getJSONResponse()
parseXmlContent() instead of parseXMLContent()
# Acceptable variable names:
var isGoodName
var base64Encoder
var xmlReader
var httpServer
属性-Properties
- 类的属性命名遵循同样的规则,除非它是静态常量。
- 静态属性的命名采用全部大写规则(upper-cased),例如:
Ext.MessageBox.YES = "Yes"
Ext.MessageBox.NO = "No"
MyCompany.alien.Math.PI = "4.13"
定义-Declaration
可以使用Ext.define
定义一个类,基本语法如下:
Ext.define(className, members, onClassCreated);
className
:类名;members
:一个对象,以“键值对(key-value pairs)“方式定义类的成员;onClassCreated
:可选回调函数,当类的所有依赖项都就绪,并且该类已经创建后调用该函数。由于类的创建是异步的,该回调函数在很多场景下都很实用;
Ext.define('My.sample.Person', {
name: 'Unknown',
constructor: function(name) {
if (name) {
this.name = name;
}
},
eat: function(foodType) {
alert(this.name + " is eating: " + foodType);
}
});
var bob = Ext.create('My.sample.Person', 'Bob');
bob.eat("Salad"); // alert("Bob is eating: Salad");
Note:我们使用
Ext.create()
方法创建了My.sample.Person
类的一个实实例,我们也可以使用new
关键字(new My.sample.Person()
),但是建议总是使用Ext.create
创建类的实例,可以充分发挥动态加载的优势。
配置-Configuration
在类创建之前,强大的 Ext.Class 预处理器(pre-processors)提供了一个专用的config
属性用于控制类的创建。包括以下特性:
- 配置属性与类的其他成员完全隔离;
- 如果配置属性的
getter
和setter
方法没有定义,那么在类的创建过程中将自动生成这些方法; - 自动生成的
setter
方法在设置属性值之前调用apply
方法(如果类定义了该方法)。如果你需要在设置属性值之前运行自定义的逻辑,可以重载配置属性的apply
方法。如果你的apply
方法没有返回值,那么setter
方法将不会设置该属性值。当改变了属性值时,还会调用update
方法(如果类同样定义了该方法)。apply
和update
方法都接收“新属性值”和“原属性值”两个参数;
对于使用配置属性的 Ext 类,不需要手动调用initConfig()
方法。但是,如果你定义的类是从 Ext.Base
继承或扩展的,那么还需要手动调用initConfig()
。
类定义配置示例:
Ext.define('My.own.Window', {
extend: 'Ext.Component',
/** @readonly */
isWindow: true,
config: {
title: 'Title Here',
bottomBar: {
height: 50,
resizable: false
}
},
applyTitle: function(title) {
if (!Ext.isString(title) || title.length === 0) {
alert('Error: Title must be a valid non-empty string');
}
else {
return title;
}
},
applyBottomBar: function(bottomBar) {
if (bottomBar) {
if (!this.bottomBar) {
return Ext.create('My.own.WindowBottomBar', bottomBar);
}
else {
this.bottomBar.setConfig(bottomBar);
}
}
}
});
/** A child component to complete the example. */
Ext.define('My.own.WindowBottomBar', {
config: {
height: undefined,
resizable: true
}
});
类使用示例:
var myWindow = Ext.create('My.own.Window', {
title: 'Hello World',
bottomBar: {
height: 60
}
});
// alerts "Hello World"
alert(myWindow.getTitle());
myWindow.setTitle('Something New');
// alerts "Something New"
alert(myWindow.getTitle());
// alerts "Error: Title must be a valid non-empty string"
myWindow.setTitle(null);
myWindow.setBottomBar({ height: 100 });
// alerts 100
alert(myWindow.getBottomBar().getHeight());
静态成员
静态成员可以通过 statics
配置项定义:
Ext.define('Computer', {
statics: {
instanceCount: 0,
factory: function(brand) {
// 'this' in static methods refer to the class itself
return new this({brand: brand});
}
},
config: {
brand: null
}
});
var dellComputer = Computer.factory('Dell');
var appleComputer = Computer.factory('Mac');
// using the auto-generated getter to get the value of
// a config property. Alerts "Mac"
alert(appleComputer.getBrand());
例外处理和调试
Ext JS 提供了一些调试和例外处理的有用的功能。
可以使用 Ext.getDisplayName()
获取方法的显示名称。这在抛出异常时非常有用,可以抛出引发异常的类名和方法名:
throw new Error('['+ Ext.getDisplayName(arguments.callee) +'] Some message here');
当使用 Ext.define()
定义的类的方法抛出异常时,通过基于WebKit内核的浏览器(Chrome 或者 Safari)查看调用堆栈,可以看到引发异常的类名称和方法名称。例如: