JavaScript架构设计 1.种子模块

1.  种子模块

种子模块也叫核心模块,是框架的最先执行的部分。

粽子模块包含功能:对象扩展,数组化,类型判定,简单的事件绑定与卸载,无冲突处理,模块加载与domReady。本章讲解以mass Framework的种子模块为范本。

1.1  命名空间

种子模块作为一个框架的最开始部分,除了负责辅建全局的基础设施外,你有没有想到给读者一个震撼的开场呢?俗话说,好的开头时成功的一半。

时下“霸主”jQuery 就有一个很好的开头——IIFE(立即调用函数表达式),一下子吸引住读者,让读者吃了一颗定心丸。

IIFE是现代JavaScript框架最主要的基础设施,它像细胞膜一样包裹自身,防止变量污染。但我们总得在Window里设置一个立足点,这个就是命名空间。

1       if(typeof(Ten) === "undefined") {
2                 Ten = {};
3                 Ten.Function = {}
4                 Ten.Array = {}
5                 Ten.Class = {}
6                 Ten.JSONP = new Ten.Class()
7                 Ten.XHR = new Ten.Class()
8
9             }

纵观各大类库的实现,一开始基本都是定义一个全局变量作为命名空间,然后对它进行扩展,如Base2的Base、Ext的Ext,jQuery的jQuery、YUI的YUI、dojo的dojo等。从全局变量的污染程度来看,分为两大类。

Prototype、mootools与Base2归为一类。Prototype的哲学是对JavaScript原生对象进行扩展。

第二类是jQuery、YUI、EXT这些框架。YUI与EXT就像上面给出的代码那样,以叠罗汉方式构架的。jQuery则另辟蹊径,它是以选择器为导向的,因此它的命名空间是一个函数,方便用户把CSS表达式字符串传进来,然后通过选择器引擎进行查找,最后返回一个jQuery实例。jQuery初期非常弱小,它想让别人用自己的框架,但也想像Prototype那样使用美元符号作为命名空间。因此它特意实现了多库共存机制,在$,jQuery与用户指定的命名空间中任意切换。

jQuery的多库共存原理很简单,因此后来也成为许多小库的标配。首先把命名空间保存到一个临时变量中,注意这时这个对象并不是自己框架的东西,可能是Prototype.js等巨头的,然后再搞个noConflict放回去。

 1             _jQuery = window.jQuery, _$ = window.$; //先把可能存在的同名变量保存起来
 2
 3             jQuery.extend({
 4                 noConflict: function(deep) {
 5                     window.$ = _$;//这时再放回去
 6                     if(deep) {
 7                         window.jQuery = _jQuery;
 8                     }
 9                 return jQuery;
10             };

但jQuery的noConflict只对单文件的类库框架有用,想EXT就不能复制了。因此把命名空间改名后,将EXT置为null,然后又通过动态加载方式引入新的JavaScript文件,该文件再以EXT调用,将会导致报错。

mass Framework对JQuery的多库共存进行改进,它与jQuery一样有两个命名空间,一个是美元符号,一个是根据URL动态生成的长命名空间(jQuery就是jquery)

            namespace=DOC.URL.replace(/(#.+|\W)/g,‘‘);

短的命名空随便用户改名,长的命名空间则是加载新的模块时用的,虽然用户在模块中使用$做命名空间,但当JavaScript问及加载下来时,我们会对立面的内容再包一层,将$指向正确的对象,具体实现见define方法。

1.2  对象扩展

我们需要一种机制,将新功能添加到我们的命名空间上。这方法在JavaScript通常被称做extend或mixin。JavaScript对象在属性描述符(Property Descriptor)没有诞生之前,是可以随意添加、更改、删除其成员,因此扩展一个对象非常便捷。一个简单的扩展方法实现是这样。

1             function extend(destination,source){
2                 for(var property in source)
3                     destination[property]=source[property]
4                 return destination;
5             }

不过,旧版本IE在这里有个问题,它认为像Object的原型方法就是不应该被遍历出来,因此for in循环是无法遍历名为valueOf、toString的属性名。这导致,后来人们模拟Object.keys方法实现时也遇到了这个问题。

            Object.keys = Object.keys || function(obj) {
                var a = [];
                for(a[a.length] in obj);
                return a;
            }

不同的框架,这个方法不同的实现,如EXT分为apply与applyIf两个方法,前者会覆盖目标对象的同名属性,而后者不会。dojo允许多个对象合并在一起。jQuery还支持深拷贝。下面是mass Framework的mix方法,支持多对象合并与选择是否覆写。

 1             function mix(target, source) { //如果最后参数是布尔,判定是否覆写同名属性
 2                 var args = [].slice.call(arguments),
 3                     i = 1,
 4                     key, ride = typeof args[args.length - 1] == "boolean" ? args.pop() : true;
 5
 6                 if(args.length === 1) { //处理$.mix(hash)的情形
 7                     target = !this.window ? this : {};
 8                     i = 0;
 9                 }
10                 while(source = arge[i++]) {
11                     for(key in source) {
12                         if(ride || !(key in target)) {
13                             target[key] = source[key];
14                         }
15                     }
16                 }
17                 return target;
18             }

1.3  数组化

浏览器下存在许多类数组对象,如function内的arguments,通过document.forms、form.elements、document.links,select.options、document.getElementsByName、childNodes、children等方式获取的节点集合(HTMLCollection、NodeList),或依照某些特殊写法的自定义对象。

1             var arrarLike={
2                 0:"a",
3                 1:"1",
4                 2:"2",
5                 length:3
6             }

类数组对象是一个很好的存储结构,不过功能太弱了,为了享受纯数组的那些便捷方法,我们在处理它们前都会做一下转换。

通常来说,只要[].slice.call 就能转换了,但旧版本IE下的HTMLCollection、NodeList不是Object的子类,采用如上方法将导致IE执行异常。我们看一下各大库怎么处理。

时间: 2024-10-10 14:29:41

JavaScript架构设计 1.种子模块的相关文章

JavaScript架构设计 2.模块加载系统

2.1 AMD规范 AMD是"Asynchronous Module Definition"的缩写,意为"异步模块定义".重点有两个.异步--有效避免了采用同步加载方式中导致的页面假死现象.模块定义--每个模块必须按照一定的格式编写.主要接口有两个,define与require.define是模块开发者关注的方法,require是模块使用者关注的方法. define的参数情况为define(id?,deps?,factory).第一个为模块ID,第2个为依赖列表,第

[架构设计] 组件和模块的区别

组件(Component)和模块(Module)又是一对容易混淆的名词,也常常被用来相互替换.个人总结,从设计上来看,组件强调复用,模块强调职责(内聚.分离),或者说组件是达到可复用要求的模块. Module, 中文为模块或模组.它的核心意义是分离职责,属于代码级模块化的产出.本身是一组具有一定内聚性代码的组合,职责明确.对外的接口可以是松散的,也可以是集中的.SEI的定义如下: An implementation unit of software that provides a coheren

大快大数据平台架构设计的构成模块

大数据也不是近几年才出现的新东西,只是最近几年才真正意义上变得热门.火爆!而这要得益于互联网信息技术的快速发展,网络改变世界.改变生活,大数据技术的应用让这样的改变更为深刻.关注大数据或者是互联网方面新闻的人应该知道,大数据已经上升到了国家战略的高度.可以说这是时代发展的必然趋势,从国家战略层面推进大数据技术的普及与应用,一个至关重要且非常核心的问题--数据安全问题就非常突出.解决数据安全问题,必然要回归到大数据开发所使用的框架!国内的大数据开发起步较晚于国外,所有关于大数据大开发的各种标准和规

Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle

Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle 1. 主键1 2. uniq  index2 3. 检查约束 (Check Counstraint) 对该列数据的范围.格式的限制(如:年龄.性别等)2 4. 默认约束 (Default Counstraint) 该数据的默认值2 5. trigger2 6. 外键机制  参照完整性:2 7. 断言约束:不必与特定的列绑定,可以理解为能应用于多个表的

36、生鲜电商平台-积分,优惠券,会员折扣,签到、预售、拼团、砍价、秒杀及抽奖等促销模块架构设计

说明:本标题列举了所有目前社会上常见的促销方案,目前贴出实际的业务运营手段以及架构设计,包括业务说明,仅供参考 促销体系 1.1促销体系 在电商和O2O领域,促销是运营人员的一个主要的让利行为,同时促销活动期间的购买量也较之普通商品更高,不同的阶段,对于促销的要求也是不同的. 促销实质上是一种沟通活动,即营销者(信息提供者或发送者)发出作为刺激消费的各种信息,把信息传递到一个或更多的目标对象(即信息接受者,如听众.观众.读者.消费者或用户等),以影响其态度和行为. 商城促销活动的流程概述(不含优

web架构设计经验分享(转)

本人作为一位web工程师,着眼最多之处莫过于 性能与架构,本次幸得参与sd2.0大会,得以与同行广泛交流,于此二方面,有些心得,不敢独享,与众博友分享,本文是这次参会与众同撩交流的心得,有兴趣者可以查看视频 架构设计的几个心得: 一,不要过设计:never over design 这是一个常常被提及的话题,但是只要想想你的架构里有多少功能是根本没有用到,或者最后废弃的,就能明白其重要性了,初涉架构设计,往往倾向于设计大而化一的架构,希望设计出具有无比扩展性,能适应一切需求的增加架构,web开发领

垂直型爬虫架构设计(2)

上文提到了关于爬虫的一些简单概念与爬虫真正要做的一些功能.简单的分析了一下垂直型爬虫与宽度(深度)遍历的一些特点.现在,我主要针对于垂直型爬虫的架构设计做一些简单的介绍. 1.垂直型爬虫的基本需求 目前企业级所需的基本上是垂直型爬虫.舆情分析,财经资讯资讯推荐等.基本山使用的都是垂直型爬虫来作为企业级使用的方案,企业级爬虫的特点我上篇博客里面已经讲过了,所以在做垂直型爬虫架构的时候只需要考虑抓去内容所需的功能.简单来说:拿到某篇资讯所需的方式或功能.例如:常见的 javascript方式,aja

架构设计:系统间通信(10)——RPC的基本概念

1.概述 经过了详细的信息格式.网络IO模型的讲解,并且通过JAVA RMI的讲解进行了预热.从这篇文章开始我们将进入这个系列博文的另一个重点知识体系的讲解:RPC.在后续的几篇文章中,我们首先讲解RPC的基本概念,一个具体的RPC实现会有哪些基本要素构成,然后我们详细介绍一款典型的RPC框架:Apache Thrift.接下来我们聊聊服务治理和DUBBO服务框架.最后总结一下如何在实际工作中选择合适的RPC框架. 2.RPC概述 2-1.什么是RPC RPC(Remote Procedure

GPS部标平台的架构设计(四)-百度地图设计

部标GPS软件平台之百度地图设计 地图是客户端中不可缺少的一个模块,很多人在设计和画图时候,喜欢加上地图引擎这样高大上的字眼,显得自己的平台有内涵,说白了就是用第三方的SDK来开发,早期的GPS监 控软件用的都是mapx.mapxtrem.acrgis之类的,使用的都是本地地图.不仅要购买正版地图,还要购买价格不菲的地图引擎license,服务器版的部署的时候,还要绑定到服务器ID上,现在这种开发方式已被抛弃.现在的百度地图.谷歌地图提供的SDK接口丰富,开发方便,系统稳定,大家都用的很爽. 在