读Zepto源码之代码构造

虽然近来工作中没有怎样用 zepto ,然则听说 zepto 的源码比较简单,而且网上的材料也比较多,所以我就挑了 zepto 动手,愿望能为今后浏览其他框架的源码打下基本吧。

源码版本

本文浏览的源码为 zepto1.2.0

浏览zepto之前须要相识 javascript 原型链和闭包的学问,引荐浏览王福朋的这篇文章深切明白 Javascript 原型和闭包,写得很细致,也异常易于浏览。

源码构造

团体构造

var Zepto = (function () {
  ...
})()

window.Zepto = Zepto
window.$ === undefined && (window.$ = Zepto)

假如在编辑器中将 zepto 的源码摺叠起来,看到的就跟上面的代码一样。

zepto 的中心是一个闭包,加载终了后马上实行。然后暴露给全局变量 zepto ,假如 $ 没有定义,也将 $ 赋值为 zepto

中心构造

在这部份中,我们先不关注 zepto 的详细完成,只看中心的构造,因而我将zepto中的逻辑先移除,得出以下的中心构造:

var zepto = {}, $

function Z(doms) {
  var len = doms.length 
  for (var i = 0; i < len; i++) {
    this[i] = doms[i]
  }
  this.length = doms.length
}

zepto.Z = function(doms) {
  return new Z(doms)
}

zepto.init = function(doms) {
  var doms = ['domObj1','domObj2','domObj3']
  return zepto.Z(doms)
}

$ = function() {
  return zepto.init()
}

$.fn = {
  constructor: zepto.Z,
  method: function() {
    return this
  }
}

zepto.Z.prototype = Z.prototype = $.fn

return $

在源码中,能够看出, $ 实际上是一个函数,同时在 $ 身上又挂了许多属性和要领(这里体现在 $.fn 身上,其他的会在后续的文章中谈到)。

我们在运用 zepto 的时刻,会用 $ 去猎取 dom ,而且在这些 dom 对象身上都有 zepto 定义的林林总总的操作要领。

从上面的伪代码中,能够看到,$ 实在挪用了 zepto.init() 要领,在 init 要领中,会猎取到 dom 元素鸠合,然后将鸠合交由 zepto.Z() 要领处置惩罚,而 zepto.Z 要领返回的是函数 Z 的一个实例。

函数 Z 会将 doms 睁开,变成实例的属性,key 为对应 domObj 的索引, 而且设置实例的 length 属性。

zepto.Z.prototype = Z.prototype = $.fn

读到这里,你可能会有点迷惑,$ 终究返回的是 Z 函数的实例,然则 Z 函数明显没有 dom 的操作要领啊,这些操作要领都定义在 $.fn 身上,为何 $ 能够挪用这些要领呢?

实在关键在于这句代码 Z.prototype = $.fn ,这句代码将 Zprototype 指向 $.fn ,如许,Z 的实例就继续了 $.fn 的要领。

既然如许就已让 Z 的实例继续了 $.fn 的要领,那 zepto.Z.prototype = $.fn 又是为何呢?

假如我们再看源码,会发现有如许的一个要领:

zepto.isZ = function(object) {
  return object instanceof zepto.Z
}

这个要领是用来判读一个对象是不是为 zepto 对象,这是经由过程推断这个对象是不是为 zepto.Z 的实例来完成的,因而须要将 zepto.ZZprototype 指向同一个对象。 isZ 要领会在 init 中用到,背面也会引见。

参考

末了,一切文章都邑同步发送到微信民众号上,迎接关注,迎接提意见:

《读Zepto源码之代码构造》

    原文作者:对角另一面
    原文地址: https://segmentfault.com/a/1190000008950420
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞