jQuery 整体架构

Posted by franki on June 4, 2019

jQuery 源码分析之整体架构

阅读一个开源框架,目的无非想学习设计的思想以及实现的方式。

为什么要分析整体框架?

理清整体架构有助于接下来源码的阅读,源码脉络清晰了,接下来的细节也就娓娓道来了。

事不宜迟,下面看看jQuery的整体架构

整体架构

jQuery 框架的核心其实就是对html元素的查找匹配并且进行dom操作。

etc

$().find().css()
$().show().hide()

以上我们可以发现两个细节。

  1. jQuery对象的创建方式
  2. jQuery方法的调用方式

特点一: jQuery的无new构建

jQuery并非像大多数对象通过new的构建

大多数的对象创建可能如下:

var ajquery = function() {
    // 构造函数
}
ajquery.prototype = {
  // 原型
  say: function() {
    console.log('i am saying');
  },
  sing: function() {
    console.log('i am singing');
  }
}

var aobj = new ajquery();
aobj.say();

但是毫无疑问,jQuery并不是这样玩的,

var ajquery = function(selector, context) {
    // 构建
    return new ajquery.prototype.init(selector, context);
}
ajquery.fn = ajquery.prototype = {
  // 原型
    init: function(selector, context) {
        this.selector = selector;
        this.context = context;
        return this;
    },
    say: function() {
        console.log('i am saying');
    },
    singing: function() {
        console.log('i am singing');
    }
}

ajquery.prototype.init.prototype = ajquery.prototype;

特点二:DOM链式调用

作用有二:

  1. 节省js代码
  2. 所返回的都是同一个对象,可以提高代码的效率

etc

var ajquery = function() {
    return new ajquery.prototype.init();
}
ajquery.prototype ={
    init: function() {
        return this;
    },
    say: function() {
        console.log('i am saying');
        return this;
    }
}

ajquery.prototype.init.prototype = ajquery.prototype;
ajquery().init().say()

特点三:jQuery 插件式接口

通过函数的形式去扩展函数,而不是直接修改jQuery的prototype,这样对于用户来说更加友好。

jQuery 允许用户添加自己的扩展属性,这个对外提供这个接口,叫做jQuery.fn.extend()来对对象增加方法。

etc

jquery.extend = jquery.fn.extend = function() {}

jQuery.extend 是对jQuery本身的属性和方法进行添加

jQuery.fn.extend 是对jQuery.fn的属性和方法的添加

总结:

  • jQuery通过原型上的init方法进行构建
  • 通过prototype指针的指向,让init创建的对象重新指向jQuery类的原型
  • 这样构建出来的对象就继承了jQuery上面的所有的属性以及方法了