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) {

其实内部转换做了几件事:用自己的语言表述下

  1. 定义新类
  2. 拷贝base静态方法到新的类中,就是最终的基类,在EXT3.4中最终顶层是事件Observable
  3. 预处理器(其实就是被一轮预定义的代码给XXXX一遍)
  4. 返回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 源码解析(一)带项目分析的更多相关文章

  1. ArrayList、LinkedList和Vector的源码解析,带你走近List的世界

    java.util.List接口是Java Collections Framework的一个重要组成部分,List接口的架构图如下: 本文将通过剖析List接口的三个实现类——ArrayList.Li ...

  2. Koa源码解析,带你实现一个迷你版的Koa

    前言 本文是我在阅读 Koa 源码后,并实现迷你版 Koa 的过程.如果你使用过 Koa 但不知道内部的原理,我想这篇文章应该能够帮助到你,实现一个迷你版的 Koa 不会很难. 本文会循序渐进的解析内 ...

  3. SpringBoot Profile使用详解及配置源码解析

    在实践的过程中我们经常会遇到不同的环境需要不同配置文件的情况,如果每换一个环境重新修改配置文件或重新打包一次会比较麻烦,Spring Boot为此提供了Profile配置来解决此问题. Profile ...

  4. EventBus (三) 源码解析 带你深入理解EventBus

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40920453,本文出自:[张鸿洋的博客] 上一篇带大家初步了解了EventBus ...

  5. Android EventBus源码解析 带你深入理解EventBus

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40920453,本文出自:[张鸿洋的博客] 上一篇带大家初步了解了EventBus ...

  6. Spring IoC源码解析——Bean的创建和初始化

    Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...

  7. jQuery2.x源码解析(设计篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 这一篇笔者主要以设计的角度探索jQuery的源代 ...

  8. Python2 基本数据结构源码解析

    Python2 基本数据结构源码解析 Contents 0x00. Preface 0x01. PyObject 0x01. PyIntObject 0x02. PyFloatObject 0x04. ...

  9. 小学徒成长系列—StringBuilder & StringBuffer关键源码解析

    在前面的博文<小学徒成长系列—String关键源码解析>和<小学徒进阶系列—JVM对String的处理>中,我们讲到了关于String的常用方法以及JVM对字符串常量Strin ...

随机推荐

  1. 【转】SHELL中的IFS详解

    转自:http://smilejay.com/2011/12/bash_ifs/ 在bash中IFS是内部的域分隔符,manual中对其的叙述如下: IFS The Internal Field Se ...

  2. JS操作Json

    因为我水啊 所以我就要手打一下 熟悉一下 ===== JSON 全称 JavaScript Object Notation(标记) 一种轻量级的数据交互格式,采用完全独立于语言的文本格式 同事JSON ...

  3. git flow工作流实际项目实践

    公司项目的开发流程主要是这样 代码分为 develop分支 master分支 平时我开发的时候,主要在develop分支上改动 一般来讲,有以下几种改动方式 1.直接在develop上修改代码 这种一 ...

  4. 使用VisualVM分析性能

    性能分析神器VisualVM VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量 ...

  5. spring3.0使用annotation完全代替XML

    @Service与@Component有什么不同?那天被问到这个问题,一时之间却想不起来,就利用这篇文章来纪录spring3.0中常用的annotation. 从spring2.5开始,annotat ...

  6. 出现了内部错误-网站中X509Certificate2加载证书时出错

    今天给网站配置了加密证书文件,用类X509Certificate2加载证书文件时,一直报出现了内部错误,但是Demo中用控制台程序加载证书没任何问题 读取证书文件的语句: X509Certificat ...

  7. 用VB实现SmartQQ机器人

    这里为了便于介绍程序设计的流程,更多以代码形式给出,具体可用火狐浏览器的firebug插件来抓包分析,或者用谷歌浏览器的开发者工具进行抓包.抓包地址是:http://w.qq.com 第一步,是二维码 ...

  8. python 虚拟环境

    python3 目录venv创建为虚拟环境,并激活. $ python3 -m venv ./venv$ source venv/bin/activate -m: -m mod : run libra ...

  9. easyui-conbotree树形下拉框。。。转

    最近一直在研究这个树形的下拉选择框,感觉非常的有用,现在整理下来供大家使用: 首先数据库的表架构设计和三级菜单联动的表结构是一样,(父子关系) 1.下面我们用hibernate建一下对应的额实体类: ...

  10. Mysql 学习笔记2

    (1)MySQL查看表占用空间大小 //先进去MySQL自带管理库:information_schema //自己的数据库:dbwww58com_kuchecarlib //自己的表:t_carmod ...