读zepto.js源码的一些笔记

May 19, 2015

584

这两天把zepto.js源码重新读了一遍,对其中的一些要点做了笔记(zepto版本号:1.1.6)。

Zepto代码主要分为两部分,一部分是Zepto核心,包括Zepto集合的初始化以及常见的函数,另一部分为插件模式,包括事件绑定、ajax等。

先看一下Zepto的基本结构,简化后代码如下:

var Zepto = (function() {
  var $, zepto = {}

  //这里主要是绑定原型,返回zepto集合
  zepto.Z = function(dom, selector) {
    dom = dom || [] //对象数组
    dom.__proto__ = $.fn //将dom的原型指向$.fn
    dom.selector = selector || ''
    return dom
  }

  //判断是否为Zepto集合
  zepto.isZ = function(object) {
    return object instanceof zepto.Z
  }

  //初始化
  zepto.init = function(selector, context) {
    return zepto.Z(dom, selector)
  }

  //创建
  $ = function(selector, context){
    return zepto.init(selector, context)
  }

  //复制属性,这个函数主要用于扩展插件
  $.extend = function(target){
    return target
  }

  //原型
  $.fn = {}

  zepto.Z.prototype = $.fn

  $.zepto = zepto

  return $
}());

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

这里面有疑问的是__proto__属性,这个属性指向对象的原型,通过这个属性,zepto对象无需采用new就可以访问到原型中的方法,有些浏览器如IE10以下并没有__proto__属性,zepto是如何处理的呢?

关于underscore.js源码的一些理解与笔记

Feb 13, 2015

623

在公司接触到的一些项目中,用到了underscore.js,但一直没时间去研究underscore.js的源码。临近过年,闲散时间多了一些,便看了underscore.js的源码,顺便把自己的一些理解记录下来。

1、_采用强制new模式,自调用构造函数

我们先来看一个例子:

function Person()
{
  this.name = "wen";
}

Person.prototype.age = 25;

var p1 = new Person(); //object
var p2 = Person(); //undefined
console.log(p1.age); //25
console.log(window.name); //wen

p2在调用构造函数时没有使用new操作符,会产生不同的结果,并且name会被添加到全局变量中,同时p2也没有原型链中的属性。(注:ES5严格模式下this并不会指向全局对象)。

我们看一下underscore中的处理,首先检测obj是否是_的实例,如果是直接返回obj,否则继续检查this对象是否是_的实例,如果不是,用new操作符实例_并返回。

代码如下:

var _ = function(obj) {
  if (obj instanceof _) return obj;
  if (!(this instanceof _)) return new _(obj);
  this._wrapped = obj;
};

这样做的好处就是能够保证我们调用的_对象不会丢失掉原型的链接,并且在没有使用new操作符时也能正常工作。

Wen's Blog

文章归档 » 文章标签 » 博主:吴文伟,Web开发爱好者,专注于前端开发,该博客用于记录和分享平时遇到的一些问题以及知识。

订阅

联系方式

链接