ExtJS4 源码解析(一)带项目分析
Ext这个东东太大了,能看完就已经很不错了,完整的源码分析就不敢说了,大概就涉及了类管理,事件管理,数据结构缓存架构,UI组件核心机制,MVC这几个方面,只是挑着源码看的,没有实际完整的使用.
公司的框架我是借鉴了EXT的结构..站在巨人的肩上我们可以走的更远,内部的结构我已经改动了,组件的形式去架构不适合咱公司~
如图~
- 昨天遇到个问题在mixins(向创建的类中要掺进其它类的信息)多个的时候就出问题了~ 顺便就发一下我的源码分析吧.当然是个人角度,有错误欢迎指出.
- 发几本EXT的书,以前分析代码的时候看过了,感觉还行
EXT3.4 到 4.0改动真心很大…以前是用3.4玩的,后来看到4.0又把代码给整个重构了一次
这里先着重讲一下 ExtJs4.0 Class的实现:
ExtJs4.0中,涉及Class实现的主要是Ext Core , Ext.Class, Ext.Base, Ext.ClassManager 这几个对象
- Base.js定义了Base类,Base类是ExtJS4.0中所有通过Ext.define定义的类的直接或间接父类,Base类中定义了一些通用的实例与静态属性与方法;
- Class.js文件中定义了Class类,所有通过Ext.define定义的类都是Class的实例(其实是Class构造函数中的newClass类);
- ClassManager.js文件中定义了ClassManager单例,它主要负责对类的管理,如类的创建与类实例化等;
- Loader文件中定义了Loader单例,实现了ExtJS4.0中动态加载类的功能。
我是用的sencha分析的,不过sencha也是基于ext的
在ExtJs4.0中,声明类的方式改为了 Ext.define('ClassName',{}); 这个方法其实是Ext.ClassManager.create的一个别名,具体用法请看API吧,这里只谈谈具体的实现
分析代码咱先从入口开始
Ext.define 在Ext.ClassManager中
1: /**
2: * Convenient shorthand for {@link Ext.ClassManager#create}, see detailed {@link Ext.Class explanation}
3: * @member Ext
4: * @method define
5: * alert( Object.keys(Ext.ClassManager.classes) )
6: */
7: define: alias(Manager, 'create'),
alias(object, methodName):顾名思义,别名方法,将object的mothodName方法赋予给指定对象
实际上的处理函数就是定义在 Manager上的create方法了
在这个过程中,首先通过 Ext.Class建立原始Class,填充应用Ext.define中的配置信息,类预处理器。
1: return new Class(data, function() {
2:
3: var postprocessors = Ext.Array.from(data.postprocessors || manager.getDefaultPostprocessors()),
4: process = function(clsName, cls, clsData) {
5: var name = postprocessors.shift();
6:
7: if (!name) {
8: manager.set(className, cls);
9:
10: if (Ext.isFunction(createdFn)) {
11: createdFn.call(cls, cls);
12: }
13:
14: return;
15: }
16:
17: this.getPostprocessor(name).call(this, clsName, cls, clsData, process);
18: };
19:
20: process.call(manager, className, this, data);
21: });
在此方法内部,会先将className添加到data,之后会new一个Class并返回,所以可以说Ext.define出的类都是Class这个类的实例,这里其实是Class构造函数中的newClass类,Class实例都被Manager.classes给保存着
由此可见
ClassManager.js只是定义了ClassManager单例,它主要负责对类的管理,如类的创建与类实例化等;
真正核心的文件Class.js
1: Ext.Class = function(newClass, classData, createdFn) {
其实内部转换做了几件事:用自己的语言表述下
- 定义新类
- 拷贝base静态方法到新的类中,就是最终的基类,在EXT3.4中最终顶层是事件Observable
- 预处理器(其实就是被一轮预定义的代码给XXXX一遍)
- 返回newClass这个新类
其实在外部还有后处理器,这个以后再说
具体的实现咱们看源码:
1: if (Ext.isObject(newClass)) {
2: createdFn = classData;
3: classData = newClass;
4: newClass = function() {
5: return this.constructor.apply(this, arguments);
6: };
7: }
这里要这样写,其实这里涉及到了EXT的组件模型管理机制
EXT是一套继承体系,
我先搬运一张3.4的图(4.0也类似)
用我的理解就是一种倒序法,简单的说
Extjs组件架构采用的是 一套倒树结构,父类子类之间关系是可以通过继承实现
还是用我的项目为例吧,反正这个东东我也实现了
new 一个Content对象
1:
2: //Activity行为预创建节点,支持PPT多动画
3: if (sqlRet.imageId) {
4: return function(rootEle, pageIndex) {
5: Xut.create('Xut.Content', {
6: 'container' : rootEle || opts.rootEle,
7: "type" : 'Content',
8: "id" : sqlRet.imageId,
9: "pageIndex" : pageIndex,
10: "isAutoPlay" : false,
11: "activityMode": true, //针对预先触摸加载方式
12: "processstate": "preprocess"
13: })
14: }
15: }
如图创建了一个 new Xut.Content 对象, 可是在实际构造中,代码的开始执行确实最顶层基类Xut.Component
代码中的实现
定义的Xut.Content 类
1: Xut.define('Xut.Content', {
2:
3: //继承Xut.ActionBase类
4: extend: 'Xut.ActionBase',
5:
6: //PPT动画接口
7: mixins: {
8: EffectApi: 'Xut.EffectApi'
9: },
1: //================ 热点动作处理类=============
2: //
3: // 点击动作行热点基类
4: //
5: // 继承 Xut.Behavior 行为基类
6: //
7: // 1 获取数据
8: // 2 配置关闭按钮
9: //
10: //
11: Xut.define('Xut.ActionBase', {
12:
13: /* 开始定义 */
14:
15: extend: 'Xut.Behavior',
1: //================ 热点动作处理类=============
2: //
3: // 热点具有的基本行为动作
4: //
5: // 1 Iscroll 导入扩展
6: //
7: // 2 关闭按钮生成
8: //
9: // 3 创建关闭按钮
10: //
11:
12: Xut.define('Xut.Behavior', {
13:
14: /* 开始定义 */
15:
16: extend: 'Xut.Component',
//==============UI交互动作基类===================
//
// 子类
// 触发型热点 ActionBase
// 交互型热点 WidgetBase
// Xut.define('Xut.Component', { /* 开始定义 */ mixins: {
observable: 'Xut.core.Observable'
}, statics: {
AUTO_ID: 1000
},
执行循序
new Xut.Content –> Xut.Component –> Xut.Behavior –> Xut.ActionBase –> Xut.Content –>
开始又往上层找 Xut-ActionBase –>Xut.Behavior->Xut.ActionBase –> Xut.Component
是不是很晕。。。ext内部就是这样玩的,为什么要这样,以后如果有时间说下UI组件机制就知道了
回归正题,这样的倒序调用,是怎么实现的
new一个子类,直接跨过N层到了基类Xut.Component
大家回过神来
1: newClass = function() {
2: return this.constructor.apply(this, arguments);
3: };
注意这里
核心点
return this.constructor.apply(this, arguments);
当我们传递的第一个参数不是对象(函数也是对象),那么EXT内部帮我构造了个 构造函数
这是有什么用?第二节接着分析
ExtJS4 源码解析(一)带项目分析的更多相关文章
- ArrayList、LinkedList和Vector的源码解析,带你走近List的世界
java.util.List接口是Java Collections Framework的一个重要组成部分,List接口的架构图如下: 本文将通过剖析List接口的三个实现类——ArrayList.Li ...
- Koa源码解析,带你实现一个迷你版的Koa
前言 本文是我在阅读 Koa 源码后,并实现迷你版 Koa 的过程.如果你使用过 Koa 但不知道内部的原理,我想这篇文章应该能够帮助到你,实现一个迷你版的 Koa 不会很难. 本文会循序渐进的解析内 ...
- SpringBoot Profile使用详解及配置源码解析
在实践的过程中我们经常会遇到不同的环境需要不同配置文件的情况,如果每换一个环境重新修改配置文件或重新打包一次会比较麻烦,Spring Boot为此提供了Profile配置来解决此问题. Profile ...
- EventBus (三) 源码解析 带你深入理解EventBus
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40920453,本文出自:[张鸿洋的博客] 上一篇带大家初步了解了EventBus ...
- Android EventBus源码解析 带你深入理解EventBus
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40920453,本文出自:[张鸿洋的博客] 上一篇带大家初步了解了EventBus ...
- Spring IoC源码解析——Bean的创建和初始化
Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...
- jQuery2.x源码解析(设计篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 这一篇笔者主要以设计的角度探索jQuery的源代 ...
- Python2 基本数据结构源码解析
Python2 基本数据结构源码解析 Contents 0x00. Preface 0x01. PyObject 0x01. PyIntObject 0x02. PyFloatObject 0x04. ...
- 小学徒成长系列—StringBuilder & StringBuffer关键源码解析
在前面的博文<小学徒成长系列—String关键源码解析>和<小学徒进阶系列—JVM对String的处理>中,我们讲到了关于String的常用方法以及JVM对字符串常量Strin ...
随机推荐
- Kafka replication
Kafka replication kafka_replication_detailed_design_v2.pdf kafka Detailed Replication Design V3 Apac ...
- http://devdocs.io/【文档收藏】
http://devdocs.io http://bower.io/ www.bower.iobrowserify.org jsPlumb布局 https://github.com/lndb/jsPl ...
- VS2015 RTM与ASP.NET 5 RC1之坑
最近Asp.Net 5的RC1出来了 VS2015的Update1也开始进入RC阶段 嗯,微软尿性,是时候转移到VS2015了 开始踩坑之旅 装好VS2015后,当然是开始折腾ASP.Net 5嘛 建 ...
- Files 的值“<<<<<<< .mine”无效。路径中具有非法字符
解决冲突,告诉SVN这个问题已解决(Resolved). 一般更简单些:在你的工程OBJ/DEBUG目录下,找到 工程名.csproj.FileListAbsolute.txt的文件打开并删除含有'& ...
- html5shiv.js and respond.min.js
因为用到这两个插件,所以记录下来.. html5shiv:解决ie9以下浏览器对html5新增标签的不识别,并导致CSS不起作用的问题. respond.min:让不支持Css3 Media Quer ...
- 深入浅出HTTP协议(WEB开发和面试必备)
1. 基础概念篇 a.简介 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consortium)和 ...
- JS转换数字金额为大写
function DX(n){ if (!/^(0|[1-9]\d*)(\.\d+)?$/.test(n)) return ""; var unit = "仟佰拾亿仟佰拾 ...
- css解决display:inline-block;产生的缝隙(间隙)
今天在做H5的水平滑动卡片时用到了display:inline-block;却发现处在同一水平线上的元素之间居然产生了缝隙,这很显然不是我想要的效果,所以我就换成了左浮动,这样缝隙的问题是解决了,但是 ...
- nodejs学习之events
在node里许多对象都发出事件:一个net.Server对象每次一个连接到来,都发出一个事件,一个fs.readStream对象在文件打开时放出一个事件.所有能放出事件的对象都是event.Event ...
- 一台linux真实机实现多台Tomcat服务
一.事前准备 ü 确保linux并未安装tomcat (这里虚拟机测试) ü 下载jdk与tomcat ① jdk-6u18-ea-bin-b01-linux-i586-20_aug_2009.bin ...