解读sencha touch移动框架的核心架构(一)

时间:2022-10-16 04:43:50

sencha的前身就是Extjs了,sencha 框架是世界上第一个基于HTML5的Mobile App框架

那么何谓框架,传统软件工程对于库和框架的区分主要着眼于对应用运行流程的控制权,框架提供架构,控制运行流程,让开发者在合适的地方书写针对具体问题的代码

sencha提倡的就是组件化编程,是面向对象的技术的一种近一步的发展延伸,类的概念仍然是组件技术中一个基础的概念,但是组件技术更核心的概念是接口。

sencha是重量级的架构了,一般来说很少会有公司用到内部的这种架构,因为太像java的Swing了

不过我在项目中用sencha组织的代码结构拿来主义本来不是我的风格,自己也改动了很多代码, 但是整体的设计还是参考的sencha了

有项目图为证:3万行以上的纯js代码架构哦~

AMD + sencha核心

AMD模块

sencha架构模块

AMD/CMD的实现只用了100行不到的代码,只是为简单的管理模块

在强类型语言中,继承机制是得到语言本身的支持的,就算代码开发者比较一般,也不会出太大的问题,但是js就不同了,要实现这一套机制就有一套很复杂的模拟

当然这里性能与维护扩展本来就是一个单选题 - -.

当然像backbone这种也是类似的提供纯架构方案

为什么我选择sencha作为参考架构呢?

高端大气上档次

关于Ext/sencha的好与坏这里就不多加讨论了,它的精华是需要你去慢慢体会的


按照最新sencha 2.3.1源码的区分

从Ext4.0开始,风格大变,提供一个完整的沙箱模式

就只针对core文件夹的内容,具体就是这么几个文件了,

Ext.js,Base.js,Class.js,ClassManager.js,Loader.js

这里是架构的核心文件,架构真心有点复杂,先看看历史的演变,老版本的架构


EXTJS组件化编程

组件化的简单定义:

组件化的基础是面向对象,在面向对象编程的基础上将一个或多个小部件封装到一起,成为一个模块,让其成为一个新的组件(适合我们需求的组件),每一个模块都应当具备单独运行的能力

解读sencha touch移动框架的核心架构(一)

通过继承来实现了对象的封装,ExtJS最底层的那个基类是Observable,它提供了最基础的事件机制,通过层层的封装与扩展,它的派生类中是越来越庞大,所提供的功能也越来越多,就比如Window这个组件,它继承自Panel并添加了默认的resizabel,closable,draggable等属性(Panel也可以加入类似的函数,但是需要编码实现)。而Panel又继承自Container,并加入了渲染Title和tbar等功能


先看老版本的实现继承的机制

Ext.extend( superclass, overrides )  在4.0后就作废了,统一换成了Ext.define的架构方式

先看3.4版本的,之后在过渡4.0,发现是一个多么大的跨越

Ext.apply(Ext, {

        /**
* This method deprecated. Use {@link Ext#define Ext.define} instead.
* @method
* @param {Function} superclass
* @param {Object} overrides
* @return {Function} The subclass constructor from the `overrides` parameter, or a generated one if not provided.
* @deprecated 2.0.0 Please use {@link Ext#define Ext.define} instead
*/
extend: function() {
// inline overrides
var objectConstructor = objectPrototype.constructor,
inlineOverrides = function(o) {
for (var m in o) {
if (!o.hasOwnProperty(m)) {
continue;
}
this[m] = o[m];
}
}; return function(subclass, superclass, overrides) {
// First we check if the user passed in just the superClass with overrides
if (Ext.isObject(superclass)) {
overrides = superclass;
superclass = subclass;
subclass = overrides.constructor !== objectConstructor ? overrides.constructor : function() {
superclass.apply(this, arguments);
};
} //<debug>
if (!superclass) {
Ext.Error.raise({
sourceClass: 'Ext',
sourceMethod: 'extend',
msg: 'Attempting to extend from a class which has not been loaded on the page.'
});
}
//</debug> // We create a new temporary class
var F = function() {},
subclassProto, superclassProto = superclass.prototype; F.prototype = superclassProto;
subclassProto = subclass.prototype = new F();
subclassProto.constructor = subclass;
subclass.superclass = superclassProto; if (superclassProto.constructor === objectConstructor) {
superclassProto.constructor = superclass;
} subclass.override = function(overrides) {
Ext.override(subclass, overrides);
}; subclassProto.override = inlineOverrides;
subclassProto.proto = subclassProto; subclass.override(overrides);
subclass.extend = function(o) {
return Ext.extend(subclass, o);
}; return subclass;
};
}(), /**
* Proxy to {@link Ext.Base#override}. Please refer {@link Ext.Base#override} for further details.
*
* @param {Object} cls The class to override
* @param {Object} overrides The properties to add to `origClass`. This should be specified as an object literal
* containing one or more properties.
* @method override
* @deprecated 2.0.0 Please use {@link Ext#define Ext.define} instead.
*/
override: function(cls, overrides) {
if (cls.$isClass) {
return cls.override(overrides);
}
else {
Ext.apply(cls.prototype, overrides);
}
}
});

在4.0以前的架构还是相对比较简单的,只是用了一个关键的继承,不像4.0以后那就是一套完整的沙箱架构

针对JS的继承机制,那本红本书高3已经把细节讲的很透彻了

当然也有漏掉的,比如创建一个空函数的作用

var F = function() {},
F.prototype = superclassProto;
subclassProto = subclass.prototype = new F();

backbone的继承机制基本大同小异


实现详解

一般继承的手段无非就是两种,原型继承与对象冒充

⒈原型继承就是利用了原型的查找合函数的作用域,好处就是内存处只有一份,坏处就是原型是共享的,如果有引用类型所有的实例都可以被修改

⒉对象冒充就是拷贝属性了,把所有的实例属性与方法都拷贝一次,坏处自然就是每一份拷贝都是占独立的一份空间了

原型继承自然就是引用原型链了,这个prototype没什么好说的,但是不能继承静态属性,因为这个不在原型链上

对象冒充,就是通过call,apply处理的,因为JS有运行作用域的,要注意了prototype上的的属性是不会被处理的

现在看看Ext的完美解决方案

看下面例子,实现一个最基本的继承

var a = function(id){
this.name = id;
} a.prototype = {
sayA : function(){
alert(this.name)
}
}; var b = Ext.extend(a, {
constructor:function(name){
this.name = name;
},
sayB : function(){
this.constructor.superclass.constructor(111)
}
}); c = new b('Aaron')

ext需要解决的问题

1 构造器问题:类b没有构造器,直接是通过Ext.extend生成的,所以内部可定需要类似工厂方法,生成一个类的包装器

2 父类调用:原型只能继承原型链上的属性与方法,如果要调用父类构造器,如何处理?所以ext需要留一个接口出来可以调用父类

3 静态方法处理

4 实现继承后,构造器引用被修改

可以先思考下以上问题,具体的实现请等下一章~

														
		

解读sencha touch移动框架的核心架构(一)的更多相关文章

  1. 解读sencha touch移动框架的核心架构&lpar;二&rpar;

    本来这行要详解Ext.extend的,但是发现网站有很详细的,那么就跳过去吧 为保持一个系列的分析,还是先搬过来吧,下章开始分析Ext4.0的新架构 在Java中,我们在实现继承的时候存在下面几个事实 ...

  2. sencha touch 入门学习资料大全&lpar;2015-12-30&rpar;

    现在sencha touch已经更新到2.4.2版本了 重新整理一下资料 官方网站:http://www.sencha.com/products/touch/ 在线文档:http://docs.sen ...

  3. 【PHP】用了这么久的Laravel框架,你分析过核心架构了没

    Laravel最初的设计是为了面向MVC架构的,它可以满足如事件处理.用户身份验证等各种需求.另外它还有一个由管理数据库强力支持,用于管理模块化和可扩展性代码的软件包管理器. Laravel以其简洁. ...

  4. sencha touch 入门系列 (五)sencha touch运行及代码解析(上)

    由于最近项目比较忙,加之还要转战原生开发,所以很久没更新了,今天我们接着上一次的内容往下讲: 首先我们打开index.html,这是我们整个程序的访问入口,也是整个项目的引入地: <!DOCTY ...

  5. sencha touch 框架的几种核心脚本文件之间的区别

    sencha-touch-debug.js      供开发时用sencha-touch.js   供发布时用sencha-touch-all.js All     供不能使用SDK构建应用程序时,将 ...

  6. 动端逐渐出了许多的移动端的框架,比如Sencha Touch、JQTouch、Jquery-moblie、jqMobi等等。这些框架都有优缺点,不同的框架应用在不同的项目中。现简单阐述一下各框架的优缺点:

    移动前端工作的那些事---前端制作之微信小技巧篇   (2013-11-15 15:20) 转载▼ 标签: it css3/javascript html5 webapp 手机网站搭建 分类: 前端制 ...

  7. 移动Web框架&colon;jQuery Mobile VS Sencha Touch

    最近常被问到是用 jQuery Mobile还是Sencha Touch,本人也比较关注这两个框架,试图从以下两方面发表点儿见解: 身家背景,都系出名门 1.jQuery Mobile 建立在jQue ...

  8. 跟我一起玩转Sencha Touch 移动 WebApp 开发(一)

    1.目录 移动框架简介,为什么选择Sencha Touch? 环境搭建 创建项目框架,框架文件简介 创建简单Tabpanel案例 自定义图标的方式 WebApp产品测试和发布 HTML5离线缓存 发布 ...

  9. &lpar;转&rpar;Sencha Touch和jQuery Mobile的比较

    原文:http://extjs.org.cn/node/664 Sencha Touch和jQuery Mobile的比较 Posted 周三, 08/07/2013 - 10:07 by admin ...

随机推荐

  1. angular form 验证 ngMessage

    <!DOCTYPE HTML> <html ng-app="deliciousApp"> <head> <meta charset=&qu ...

  2. centos6&period;4上安装phpmyfaq

    phpmyfaq真是奇怪呀,官网上只能下载到当前的版本,无法下载以前的版本.官网为:http://www.phpmyfaq.de/ 官网上没有phpmyfaq的安装方法,我在网上找了下,这就个文章还比 ...

  3. &lbrack;Swust OJ 567&rsqb;--老虎在不在笼子里&lpar;凸包问题&rpar;

    题目链接:http://acm.swust.edu.cn/problem/567/ Time limit(ms): 1000 Memory limit(kb): 65535   一只老虎自从看了&lt ...

  4. 关于dubbo分享

    一.dubbo服务是基于zookeeper提供服务.提供消费 1.Zookeeper的作用: zookeeper用来注册服务和进行负载均衡,哪一个服务由哪一个机器来提供必需让调用者知道,简单来说就是i ...

  5. 小星星的php

    大家好,我是小星星,最近新学的php,我迫不及待要跟大家分享了!!come on!一起来看小星星的世界 先为大家介绍php基础 首先我们来看看什么叫php: PHP(外文名:PHP: Hypertex ...

  6. Codeforces Round &num;245 &lpar;Div&period; 2&rpar;

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/yew1eb/article/details/25609981 A Points and Segmen ...

  7. Javaweb笔记—03(BS及分页的业务流程)

    DAO部分:中间层声明该有的变量 pagerBook pageData sumRow sumPage求出总的记录数id唯一标识:select count(id) as rowsum from book ...

  8. Gunicorn设计部分的翻译

    Design 关于Gunicorn架构的简要描述. Server Model Gunicorn是基于pre-fork(预启动,提前fork)的工作模式.这就意味着Gunicorn是由一个主进程来管理这 ...

  9. 在技术胖博客上学习ES6遇到的坑和想法

    第一节:ES6的开发环境搭建 坑1:全局安装babel-cli已经不被官方推荐,改为局部安装(cnpm install babel-cli --save-dev): 坑2:babel src/inde ...

  10. Scrum Meeting 6 -2014&period;11&period;12

    今天apec最后一天,大部分任务都差不多了,局部测试问题不大.大家修复下小细节就可以开始整合了. Member Today’s task Next task 林豪森 协助测试及服务器部署 协助测试及服 ...