zepto源码分析·整体架构
代码数量
1.2.0版本代码量为1650行,去掉注释大概1500左右
代码模块
默认版本只包括核心模块,事件模块,ajax模块,form模块和ie模块,其它模块需要自行拓展加入,其中form模块只包含序列化操作和submit提交事件实现,ie模块只包括一点兼容性处理,两者码量极少,因此不做分析
执行结构
典型的即时函数,保证封装性
(function (global, factory) {
// amd,cmd的模块化检测
})(this, function(window) {
// zepto初始化代码
})
模块结构
(function (global, factory) {
// amd,cmd的模块化检测
})(this, function(window) {
// 核心模块
var Zepto = (function () {
}();
// 事件模块
;(function (){
})(Zepto)
// ajax模块
;(function (){
})(Zepto)
// form模块
;(function (){
})(Zepto)
// ie模块
;(function (){
})()
})
架构原理
(function (global, factory) {
// amd,cmd的模块化检测
})(this, function(window) {
// 核心模块
var Zepto = (function () {
var $, zepto = {};
// 第四步
function Z(dom, selector) {
// zepto对象创建,返回this
}
// 第三步
zepto.Z = function(dom, selector) {
return new Z(dom, selector)
}
// 是否为zepto.Z实例
zepto.isZ = function(object) {
return object instanceof zepto.Z
}
// 第二步
zepto.init = function(selector, context) {
// 选择器解析,获得dom元素集合
return zepto.Z(dom, selector);
}
// 第一步
$ = function (selector, context) {
return zepto.init(selector, context)
}
// 定义代表原型对象的fn属性
$.fn = {
constructor: zepto.Z,
length: 0
}
// 串通原型链
zepto.Z.prototype = Z.prototype = $.fn;
// 赋值zepto引用给$
$.zepto = zepto;
return $
}();
// window上注册Zepto
window.Zepto = Zepto
window.$ === undefined && (window.$ = Zepto)
// 其它模块省略...
})
1.库的架构方面,先是定义了2个变量,未声明的$和zepto对象;将$赋值为函数,定义fn属性来作为库本身的原型对象,对zepto对象定义一些操作方法
2.通过$方法实现选择器初始化操作,通过zepto.init实现dom集合生成,通过zepto.Z和Z函数生成一个Zepto对象,也就是如上注释的1,2,3,4步
3.其中Z.prototype = $.fn是为new Z实例定义原型,zepto.Z.prototype = Z.prototype则只是用于zepto.isZ函数操作,以便判断是否传入的内容为zepto.Z实例
4.个人感觉zepto.isZ函数实现略微麻烦,改成如下形式会更简洁
// 核心模块
var Zepto = (function () {
var $, zepto = {};
zepto.isZ = function(object) {
// zepto.Z改成Z
return object instanceof Z
}
// zepto.Z改成Z
$.fn = {
constructor: Z,
length: 0
}
// zepto.Z.prototype = Z.prototype去掉
Z.prototype = $.fn;
return $
}();
对比jquery架构
var jQuery = function( selector, context ) {
// 避免this instanceof jQuery判断
// 避免new jQuery的死循环
// 初始化方法采用原型上的init方法
return new jQuery.fn.init( selector, context );
}
// 定义fn属性指向jQuery原型
jQuery.fn = jQuery.prototype = {
constructor: jQuery
}
// 通过将init方法的原型指向jquery原型解决this问题
jQuery.fn.init.prototype = jQuery.fn;
// 通过this的力量共享extend拓展方法,实现根据调用对象进行对应拓展
jQuery.extend = jQuery.fn.extend = function() {
}
jQuery的原型链构建和extend实现真是精妙绝伦,jQuer的架构实现比Zepto更简洁,作用上更清晰,Zepto的实现相对繁琐
zepto源码分析·整体架构的更多相关文章
- 精尽 MyBatis 源码分析 - 整体架构
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- Fresco 源码分析 —— 整体架构
Fresco 是我们项目中图片加载专用框架.虽然我不是负责 Fresco 框架,但是由本人负责组里的图片加载浏览等工作,因此了解 Fresco 的源码有助于我今后的工作,也可以学习 Fresco 的源 ...
- jquery-2.0.3 源码分析 整体架构
关键 var jQuery = function( selector, context ) { return new jQuery.fn.init(); } jQuery.fn = jQuery.pr ...
- [转]Libev源码分析 -- 整体设计
Libev源码分析 -- 整体设计 libev是Marc Lehmann用C写的高性能事件循环库.通过libev,可以灵活地把各种事件组织管理起来,如:时钟.io.信号等.libev在业界内也是广受好 ...
- zepto源码分析系列
如果你也开发移动端web,如果你也用zepto,应该值得你看看.有问题请留言. Zepto源码分析-架构 Zepto源码分析-zepto(DOM)模块 Zepto源码分析-callbacks模块 Ze ...
- 一个普通的 Zepto 源码分析(二) - ajax 模块
一个普通的 Zepto 源码分析(二) - ajax 模块 普通的路人,普通地瞧.分析时使用的是目前最新 1.2.0 版本. Zepto 可以由许多模块组成,默认包含的模块有 zepto 核心模块,以 ...
- 一个普通的 Zepto 源码分析(三) - event 模块
一个普通的 Zepto 源码分析(三) - event 模块 普通的路人,普通地瞧.分析时使用的是目前最新 1.2.0 版本. Zepto 可以由许多模块组成,默认包含的模块有 zepto 核心模块, ...
- 一个普通的 Zepto 源码分析(一) - ie 与 form 模块
一个普通的 Zepto 源码分析(一) - ie 与 form 模块 普通的路人,普通地瞧.分析时使用的是目前最新 1.2.0 版本. Zepto 可以由许多模块组成,默认包含的模块有 zepto 核 ...
- Zepto源码分析(一)核心代码分析
本文只分析核心的部分代码,并且在这部分代码有删减,但是不影响代码的正常运行. 目录 * 用闭包封装Zepto * 开始处理细节 * 正式处理数据(获取选择器选择的DOM) * 正式处理数据(添加DOM ...
随机推荐
- lvm创建逻辑卷技巧
公司使用的服务器都是虚拟机,是虚拟机管理员通过模板创建的. 创建的所有逻辑卷都是使用的sda盘. 而我们在部署应用时需要和系统所在盘分离.(提高磁盘读写速度,避免系统盘被占满) 以前都是先创建新的逻辑 ...
- HNU_小初高数学学习软件_功能说明
结对编程项目主要功能: 1.用户注册功能.用户提供手机号码,点击注册将收到一个注册码,用户可使用该注册码完成注册: 2.用户完成注册后,界面提示设置密码,用户输入两次密码匹配后设置密码成功.密码6-1 ...
- 配置文件my.cnf---配置信息注释大全
在进行MySQL与CM+CHD之间的应用配置时,发现此前对于MySQL的配置含义过于模糊,所以将CM+CHD集群所涉及MySQL方面的配置含义进行抽取并加以注释,方便此后的配置和使用. 一.客户端设置 ...
- C#实现请求唯一性校验支持高并发
使用场景描述: 网络请求中经常会遇到发送的请求,服务端响应是成功的,但是返回的时候出现网络故障,导致客户端无法接收到请求结果,那么客户端程序可能认为判断为网络故障,而重复发送同一个请求.当然如果接口中 ...
- jQuery常用方法(六)-jQuery 工具
JQuery Utilities 方法说明 jQuery.browser .msie 表示ie jQuery.browser.version 读取用户浏览器的版本信息 jQuery.boxModel ...
- K8s 从懵圈到熟练 – 集群网络详解
作者 | 声东 阿里云售后技术专家 导读:阿里云 K8S 集群网络目前有两种方案:一种是 flannel 方案:另外一种是基于 calico 和弹性网卡 eni 的 terway 方案.Terway ...
- 第一篇:php开发环境
Window: 1.XAMPPhttps://www.apachefriends.org/index.html 2.WampServerhttp://www.wampserver.com/ Linux ...
- 使用JavaScript·求数组的最大值和最小值
前言 在数组中并没有提供arr.max()和arr.min()这样的方法.那么是不是可以通过别的方式实现类似这样的方法呢?那么今天我们就来整理取出数组中最大值和最小值的一些方法. 法一:其实利用 ...
- Spark 学习笔记之 Streaming和Kafka Direct
Streaming和Kafka Direct: Spark version: 2.2.0 Scala version: 2.11 Kafka version: 0.11.0.0 Note: 最新版本感 ...
- python爬虫入门10分钟爬取一个网站
一.基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序. 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT ...