ExtJS 4 类系统

ExtJS 4的类系统(class system)进行了一次重大重构,ExtJS4的新架构就是基于这套新的类系统构建的,因此有必要先了解以下这个class system
这篇文章分为四章

  • I: “Overview” 解释健壮类系统的重要性

  • II: “Naming Conventions” 最佳命名规范实践(其实是要求必须遵照它的规范)
  • III: “Hands-on” 详细的例子
  • IV: “Errors Handling & Debugging” 一些处理问题的实用提示

I. Overview 概览

ExtJS 4 有300多个类,社区里有20w+不同背景的开发者,提供一个好的代码架构是个巨大的挑战:

  • 易学,学习成本低

  • 快速开发,容易调试和发布
  • 组织良好,可扩展可维护

JavaScript是个基于原型链继承的语言,没有类的概念。而且JavaScript语言特点就是松散和自由,实现一个同样的功能,可以有很多种方式,但是如果放任它的松散和自由,就很难维护和重用代码。
面向对象编程绝大部分都是基于类的。基于类的编程语言通常需要强类型,提供代码封装,并且有标准的编码习惯,说了一堆废话,不翻译了,总结以下就是能做到既有面向对象编程的规范性,又能做到JavaScript的灵活性

II. Naming Conventions 命名规范

命名规范,使用一致的命名规范可以让你的代码结构清晰,可读性强。

1. Classes 类

类名只能包含字母数字,不推荐使用数字,除非是常用词。不要用下划线中化纤等非字母数字字符。

  • MyCompany.useful_util.Debug_Toolbar 不合法

  • MyCompany.util.Base64 合法

应该组织在或者说命名空间下面,并且至少要有一个顶层命名空间,例如:

 
MyCompany.data.CoolProxy
MyCompany.Application

顶层命名空间和真正的类,应该采用驼峰式命名,其他一律小写,例如:

MyCompany.form.action.AutoLoad

非Ext官方类,不可以在Ext顶层命名空间下(这是为了防止冲突)
首字母组合词也要采用驼峰式命名,例如:

  • Ext.data.JsonProxy 而不是 Ext.data.JSONProxy

  • MyCompany.util.HtmlParser 而不是 MyCompary.parser.HTMLParser
  • MyCompany.server.Http 而不是 MyCompany.server.HTTP

2. 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就是程序跟目录下的那个app目录,所有类都应该这样组织,保证维护性

3. Methods and Variables 方法和成员变量

  • 和类名一样只能用字母和数字,其他符号不可以

  • 同样是驼峰命名,但是首字母小写,首字母组合词也如此

例如:

  • 合法的方法名:encodeUsingMd5(),getHtml()代替getHTML(),getJsonResponse()代替getJSONResponse(),parseXmlContent()代替parseXMLContent()

  • 合法的变量名:var isGoodName;, var base64Encoder, var xmlReader, var httpServer

4. Properties 属性

  • 跟成员变量一致

  • 如果是常量
Ext.MessageBox.YES = "Yes"
Ext.MessageBox.NO = "No"
MyCompany.alien.Math.PI = "4.13"

III. Hands-on 实践一下

1. Declaration 声明

1.1 老的方式

如果你使用过ExtJS 3或者之前的版本,可能会熟悉Ext.extend,可以用来创建一个类

1
var MyWindow = Ext.extend(Object, { ... });

这个方法很容易就可以声明一个类并继承自另一个类,但是也有缺陷

1
My.cool.Window = Ext.extend(Ext.Window, { ... });

这个例子中我们需要把类定义在命名空间里,并继承自Ext.Window类,但是有两个问题:

  1. My.cool必须之前定义过,这个命名空间必须已经存在

  2. Ext.Window必须已经加载

第一条通常可以使用Ext.namespace(同Ext.ns)解决,这个方法会把不存在的命名空间都创建出来,无聊的是你必须记得在Ext.extend之前加上这句话

 
Ext.ns(‘My.cool‘);
My.cool.Window = Ext.extend(Ext.Window, { ... });

第二个问题,ExtJS4以前的版本都不好解决依赖问题,因此通常是引入ext-all.js

1.2 新的方式

ExtJS 4 消除了这些弊端,只需要记住一个方法:Ext.define,基本语法如下

Ext.define(className, members, onClassCreated);
  • className 要声明的类的名字

  • members 一个对象,包含类成员
  • 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 aaron = Ext.create(‘My.sample.Person‘, ‘Aaron‘);
    aaron.eat("Salad"); // alert("Aaron is eating: Salad");

注意这里创建一个新的My.sample.Person实例使用的是Ext.create()方法,使用new关键字也可以创建实例(new My.sample.Person()),但是不推荐使用new,应该养成使用Ext.create的习惯,因为这样可以利用到动态加载的好处,有关动态加载可以参看我的另外一篇教程 ExtJS 4 入门

2. Configuration 配置(实例成员)

ExtJS 4 中引入了一个专用的config属性,这个属性在类创建之前,会被Ext.Class预先处理,并有一下特性:

  • 配置项被封装起来,和类的其他属性方法不混杂在一起了

  • 自动生成了属性的getter和setter
  • 自动生成了一个apply方法,apply方法在setter之前调用,可以通过apply方法定制setter的行为,如果apply方法没有返回值,setter就不会起作用,可以参见下面的例子中applyTitle
 
Ext.define(‘My.own.Window‘, {
   /** @readonly */
    isWindow: true,

    config: {
        title: ‘Title Here‘,

        bottomBar: {
            enabled: true,
            height: 50,
            resizable: false
        }
    },

    constructor: function(config) {
        this.initConfig(config);
    },

    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 && bottomBar.enabled) {
            if (!this.bottomBar) {
                return Ext.create(‘My.own.WindowBottomBar‘, bottomBar);
            }
            else {
                this.bottomBar.setConfig(bottomBar);
            }
        }
    }
});

这是如何使用上面的例子

 
var myWindow = Ext.create(‘My.own.Window‘, {
    title: ‘Hello World‘,
    bottomBar: {
        height: 60
    }
});

alert(myWindow.getTitle()); // alerts "Hello World"

myWindow.setTitle(‘Something New‘);

alert(myWindow.getTitle()); // alerts "Something New"

myWindow.setTitle(null); // alerts "Error: Title must be a valid non-empty string"

myWindow.setBottomBar({ height: 100 }); // Bottom bar‘s height is changed to 100

3. Statics 静态成员

静态成员通过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
    },

    constructor: function(config) {
        this.initConfig(config);

        // the ‘self‘ property of an instance refers to its class
        this.self.instanceCount ++;
    }
});

var dellComputer = Computer.factory(‘Dell‘);
var appleComputer = Computer.factory(‘Mac‘);

alert(appleComputer.getBrand()); // using the auto-generated getter to get the value of a config property. Alerts "Mac"

alert(Computer.instanceCount); // Alerts "2"

IV. Errors Handling & Debugging 错误处理和调试

ExtJS 4 引入了很多有用的特性帮助调试和错误处理

可以使用Ext.getDisplayName()获得函数名称,例如

1
throw new Error(‘[‘+ Ext.getDisplayName(arguments.callee) +‘] Some message here‘);

在用Ext.define()定义出来的类中抛出(throw)错误(error),可以在safari或者chrome的控制台中看到方法名和类名和调用栈

时间: 2024-10-05 23:46:51

ExtJS 4 类系统的相关文章

[ExtJS学习笔记]第六节 Extjs的类系统Class System命名规则及定义和调试

本文地址: http://blog.csdn.net/sushengmiyan/article/details/38479079 本文作者:sushengmiyan -------------------------------------------------------------资源链接----------------------------------------------------------------------- 翻译来源  Sencha Cmd官方网站:    http:

【Install】我是如何安装Linux类系统的

安装系统:ubuntu12.04 i386 DVD U盘启动12.04live系统 连线,设置连接 安装系统到硬盘 "语言支持",更新 安装gnome经典界面 sudo apt-get install gnome-shell gnome-tweak-tool gnome-panel 关闭unity的全局菜单 sudo apt-get   autoremove  indicator-appmenu   appmenu-gtk   appmenu-gtk3   appmenu-qt 让窗口

Debian类系统必做——将【你的用户】加入sudoers用户组

切换到root:su root 修改sudoers nano /etc/sudoers 在root    ALL=(ALL:ALL) ALL下,加入:liz        ALL=(ALL:ALL) ALL Debian类系统必做--将[你的用户]加入sudoers用户组

新闻资讯类系统 ---- 文章分类和标签的设计

零. 简介 博客. CMS(网易新闻. 腾讯新闻) 之类的系统, 核心就是文章, 一切的一切都围绕着文章进行, 所以设计一个好的文章分类和标签的数据库关系模型, 对后续编码及维护将会起到至关重要的作用. 一. 分类 一篇文章, 比如 <大陆 ** 明星又离婚了> 这属于 「娱乐」 类新闻, 又属于 「中国」 分类下的新闻, 所以文章和分类的关系一般是 1 对 N . 数据库表结构设计 article : 字段名 注释 id title 文章标题 author 作者 create_time 创建

extJS 创建类

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Welcome to Ext JS 5.0</title> <meta name="description" content="Create amazing web apps built on web standards.

选择工程物资管理需要注意的事项,及如何让选择物资管理类系统。

随着我国经济的不断改革和发展,企业的经营管理方式也在不断的变化,对于工程类的公司,如何做好工程物资管理工作呢?下面,小编给大家整理了相关的项目管理技巧. 一.如何做好工程物资管理工作 1.供应商的选择认定 一般经过货比三家,根据择优.择廉.择近的原则选定供应商.在对不知名的小企业认定时,由质量部牵头会同有关部门负责人前去该厂家进行考察.评估,并填写"分供方质量保证能力调查(审批)表"等,认为可以的先进行"外购.外协件样品试制",样品试制送检合格后再转入小批试生产,再

几类系统需要关注的质量属性

前一篇文章,总结了三高系统所关注的一些重要质量属性.就想到,其实不同类型的系统对质量属性也往往要求大不一样. 下图是软件系统架构设计时,需要关注的一些软件质量属性. 开发期质量属性,是开发人员或后期的维护人员比较关心的,这些质量的好坏,往往会影响到开发和维护成本.而运行期质量属性,则是最终用户比较关心的,因为其在使用时是能切身体会到这些效果的,故而会影响用户对整个系统的满意度. 所以,对于基于互联网的系统而言,其更关注的是:性能.可用性.伸缩性.扩展性.安全性.这些大多都是运行期的质量属性.而这

罗马皇帝矮子呸平,法国皇帝-拿破仑一世,北极星系统,美国FBI,英国MI5,日本国金色太阳圣殿,日本国小叶子集团,日本国札幌地区全体人民,乌克兰军火商集团,欧洲基督教下属的圣龙骑士团,欧洲傅里叶联盟,黄道12星座里面的双子座,地耀日12星座,地球帝国,地球联邦,地球共和国,COMSCI类星体系统,JWFD类系统系统紧急通知-立即撤离腾讯集团,阿里集团,百度集团及其下属的所有子公司和附属和控股机构

清帝国所有三爷-三太子 王府的全部人员及其下属机构和大臣的家属和全部关系户,请链接本博客文章的标题,标题党-链接五毛党,美分党 转发,抄送,不经过任何修改和改变,把本博客文章的标题和内容全部传送到清帝国的所有朝廷里面我方人员,但是拒绝把本文的任何字符和字节 传送和投递到明朝时代的任何人员和星座,动物和生物系统中 时空局的数据和信息投送节点必须严格限制在清帝国的乾隆皇帝登基之后的时间到地球第五太阳季公元纪年2020年之间,不容许跨过这个时间段投送数据和信息 BAT联盟选举了一个非常恐怖和邪恶的吸血

ExtJS 4 组件详解

ExtJS 4 的应用界面是由很多小部件组合而成的,这些小部件被称作"组件(Component)",所有组件都是Ext.Component的子类,Ext.Component提供了生命周期管理包括初始化.渲染.大小和尺寸管理.销毁等功能,这使得所有Ext.Component的子类都自动分享了这些能力.ExtJS提供了各式各样丰富的组件,每一个组件都很容易被扩展创建成自定义组件. The Component Hierarchy 组件层级 容器(Container)是个可以容纳其他组件的特殊