`
zccst
  • 浏览: 3319498 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jquery核心功能分析(带图解)

阅读更多
作者:zccst

整体架构

jQuery框架的核心就是从HTML文档中匹配元素并对其执行操作、

例如:

$().find().css()
$().hide().html('....').hide().
从上面的写法上至少可以发现2个问题

1. jQuery对象的构建方式

2 .jQuery方法的调用方式



分析一:jQuery的无new构建

JavaScript是函数式语言,函数可以实现类,类就是面向对象编程中最基本的概念


var aQuery = function(selector, context) {
        //构造函数
}
aQuery.prototype = {
    //原型
    name:function(){},
    age:function(){}
}

var a = new aQuery();

a.name();
复制代码
这是常规的使用方法,显而易见jQuery不是这样玩的

jQuery没有使用new运行符将jQuery显示的实例化,还是直接调用其函数

按照jQuery的抒写方式

$().ready()
$().noConflict()
要实现这样,那么jQuery就要看成一个类,那么$()应该是返回类的实例才对

所以把代码改一下:

var aQuery = function(selector, context) {
       return new aQuery();
}
aQuery.prototype = {
    name:function(){},
    age:function(){}
}

通过new aQuery(),虽然返回的是一个实例,但是也能看出很明显的问题,死循环了!



那么如何返回一个正确的实例?

在javascript中实例this只跟原型有关系

那么可以把jQuery类当作一个工厂方法来创建实例,把这个方法放到jQuery.prototye原型中

var aQuery = function(selector, context) {
       return  aQuery.prototype.init();
}
aQuery.prototype = {
    init:function(){
        return this;
    }
    name:function(){},
    age:function(){}
}

当执行aQuery() 返回的实例:





很明显aQuery()返回的是aQuery类的实例,那么在init中的this其实也是指向的aQuery类的实例

问题来了init的this指向的是aQuery类,如果把init函数也当作一个构造器,那么内部的this要如何处理?

var aQuery = function(selector, context) {
       return  aQuery.prototype.init();
}
aQuery.prototype = {
    init: function() {
        this.age = 18
        return this;
    },
    name: function() {},
    age: 20
}

aQuery().age  //18

这样的情况下就出错了,因为this只是指向aQuery类的,所以需要设计出独立的作用域才行



jQuery框架分隔作用域的处理

jQuery = function( selector, context ) {
        // The jQuery object is actually just the init constructor 'enhanced'
        return new jQuery.fn.init( selector, context, rootjQuery );
    },
很明显通过实例init函数,每次都构建新的init实例对象,来分隔this,避免交互混淆

那么既然都不是同一个对象那么肯定又出现一个新的问题

例如:

var aQuery = function(selector, context) {
       return  new aQuery.prototype.init();
}
aQuery.prototype = {
    init: function() {
        this.age = 18
        return this;
    },
    name: function() {},
    age: 20
}

//Uncaught TypeError: Object [object Object] has no method 'name' 
console.log(aQuery().name())

抛出错误,无法找到这个方法,所以很明显new的init跟jquery类的this分离了



怎么访问jQuery类原型上的属性与方法?

     做到既能隔离作用域还能使用jQuery原型对象的作用域呢,还能在返回实例中访问jQuery的原型对象?

实现的关键点

// Give the init function the jQuery prototype for later instantiation
jQuery.fn.init.prototype = jQuery.fn;
通过原型传递解决问题,把jQuery的原型传递给jQuery.prototype.init.prototype

换句话说jQuery的原型对象覆盖了init构造器的原型对象

因为是引用传递所以不需要担心这个循环引用的性能问题

var aQuery = function(selector, context) {
       return  new aQuery.prototype.init();
}
aQuery.prototype = {
    init: function() {
        return this;
    },
    name: function() {
        return this.age
    },
    age: 20
}

aQuery.prototype.init.prototype = aQuery.prototype;

console.log(aQuery().name()) //20

百度借网友的一张图,方便直接理解:



fn解释下,其实这个fn没有什么特殊意思,只是jQuery.prototype的引用







分析二:链式调用

DOM链式调用的处理:
1.节约JS代码.
2.所返回的都是同一个对象,可以提高代码的效率


通过简单扩展原型方法并通过return this的形式来实现跨浏览器的链式调用。

利用JS下的简单工厂模式,来将所有对于同一个DOM对象的操作指定同一个实例。

这个原理就超简单了

aQuery().init().name()

分解
a = aQuery();
a.init()
a.name()
把代码分解一下,很明显实现链式的基本条件就是实例this的存在,并且是同一个

aQuery.prototype = {
    init: function() {
        return this;
    },
    name: function() {
        return this
    }
}

所以我们在需要链式的方法访问this就可以了,因为返回当前实例的this,从而又可以访问自己的原型了

aQuery.init().name()

优点:节省代码量,提高代码的效率,代码看起来更优雅

最糟糕的是所有对象的方法返回的都是对象本身,也就是说没有返回值,这不一定在任何环境下都适合。


Javascript是无阻塞语言,所以他不是没阻塞,而是不能阻塞,所以他需要通过事件来驱动,异步来完成一些本需要阻塞进程的操作,这样处理只是同步链式,异步链式jquery从1.5开始就引入了Promise,jQuery.Deferred后期在讨论。


如果您觉得本文的内容对您的学习有所帮助,您可以微信:
  • 大小: 46.8 KB
  • 大小: 31.7 KB
分享到:
评论

相关推荐

    JQuery核心工具包

    本文将深入探讨jQuery的核心概念和常用功能。 ### 1. jQuery选择器 jQuery的选择器基于CSS,它允许开发者高效地选取HTML元素。例如,`$("#myID")`选择具有特定ID的元素,`$(".myClass")`选择所有带有指定类名的...

    jquery核心库文件

    非常好用的jquery核心库文件

    JQuery核心用法快速查询文档

    jQuery的核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的css选择器,并且可对CSS选择器进行扩展;拥有便捷的插件扩展机制和丰富的插件。jQuery兼容各种主流浏览器,如IE 6.0+、FF ...

    史上最全jquery核心库

    jquery-1.9.1.js jquery-1.9.1.min.js jquery-1.10.1.js jquery-1.10.1.min.js jquery-2.0.2.js jquery-2.0.2.min.js jquery-1.2.6.js jquery-1.2.6.min.js jquery-1.3.2.js jquery-1.3.2.min.js jquery-1.4.4.js ...

    jQuery基础核心知识

    详细介绍了jQuery的一些核心知识以及基础,理解jQuery

    jquery的核心包1.4.2

    在本文中,我们将深入探讨jQuery的核心包1.4.2,它是jQuery历史上的一个重要版本,为开发者提供了丰富的功能和高效的性能。 1. **基础概念与安装** jQuery 1.4.2 是一个轻量级的库,可以通过下载压缩包或使用CDN...

    Jquery源码分析 源码

    本文将从核心概念、设计模式、主要功能模块等方面进行详尽的jQuery源码分析。 1. **核心概念** - **选择器引擎Sizzle**:jQuery的核心是其高效的选择器引擎Sizzle,它基于CSS选择器实现,能够快速准确地定位DOM...

    jQuery带事件记录的多功能日历

    《jQuery带事件记录的多功能日历详解》 在网页开发中,日历插件是一种常见的交互元素,用于显示日期、安排事件以及提醒用户。本文将深入探讨一款特别的jQuery日历插件,它具备事件记录功能,使得日历不仅美观,而且...

    jQuery多功能搜索框插件下拉菜单选择代码

    本篇文章将深入解析名为"jQuery多功能搜索框插件下拉菜单选择代码"的项目,通过分析压缩包中的文件,揭示其工作原理和实现方式。 首先,项目中包含的主要CSS文件有`bootstrap.min.css`和`jquery.dropdown.css`。`...

    jquery1.43源码分析(核心部分)

    ### jQuery 1.4.3 源码分析(核心部分) #### 一、引言 随着 Web 技术的不断发展,JavaScript 成为了前端开发中不可或缺的一部分。而在众多 JavaScript 库中,jQuery 几乎成为了网页开发的标准工具之一。本文将...

    jQuery源码分析系列.pdf

    ### jQuery源码分析系列知识点概览 #### 一、总体架构与核心概念 - **前言开光**:介绍分析jQuery源码的目的和价值,强调通过深入研究源码,可以学习到先进的设计理念和实践技巧。 - **总体架构**:解析jQuery的...

    [pdf]Jquery1.2.6源码分析

    jQuery对象分析其运行状态以了解出错的原因。 如果对于 web 的应用的页面运行性能和效率有所要求的话,那么我们更应 该去明白其运行机理和核心源码。但是 jQuery 源码不像其它的类库那样,它有 点晦涩,难懂。这...

    jQuery.js执行过程分析

    本文将深入分析jQuery.js的核心执行流程,帮助读者理解其内部机制,尤其是jQuery如何利用构造函数和原型链实现其强大的功能。 #### 二、jQuery的基础构建 1. **防止重复加载**: 在jQuery的加载过程中,首先会...

    jquery1.43源码分析(核心部分)[收集].pdf

    在jQuery 1.4.3版本中,其核心部分主要包括选择器引擎、DOM操作、事件处理和函数封装等关键功能。 首先,jQuery的初始化过程始于`jQuery = (function(){ ... })()`,这是一个立即执行的函数表达式(IIFE),确保了...

    Jquery1.2.6源码分析教程

    **jQuery 1.2.6 源码分析教程** jQuery 是一个广泛使用的 JavaScript 库,因其简洁的语法和强大的功能而备受开发者喜爱。在 jQuery 1.2.6 版本中,虽然它已经相对老旧,但其背后的实现原理和优化策略仍然值得深入...

    Jquery1.2.6 源码分析

    Jquery1.2.6源码分析及源码文件 博文链接:https://jljlpch.iteye.com/blog/234218

    jQuery源码详细分析中文注释

    《jQuery源码详细分析中文注释》是一份深入解析jQuery库源码的宝贵资源,它为开发者提供了理解这个广泛使用的JavaScript库内部工作机制的机会。jQuery以其简洁的API和强大的功能深受前端开发者的喜爱,但其背后的...

    jquery网站功能引导用户提示操作

    "jquery网站功能引导用户提示操作"就是一种实现这一目标的技术手段。jQuery,一个广泛使用的JavaScript库,提供了丰富的功能和简单易用的API,使得创建这种用户引导提示变得轻而易举。 首先,我们需要理解jQuery的...

    jquery-ui包含功能演示及代码

     jQuery UI实际上是jQuery插件,专指由jQuery官方维护的UI方向的插件 jQuery UI 与 jquery 的主要区别是: (1) jQuery是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等。 (2) jQuery UI则是在jQuery的...

    jQuery 核心讲解 帮忙文档

    这个“jQuery核心讲解帮忙文档”是专为初学者设计的,旨在帮助他们快速掌握jQuery的基本概念和核心功能。 ### 1. jQuery选择器 jQuery的选择器基于CSS选择器,使得选取DOM元素变得简单。例如,`$("#id")`用于选取...

Global site tag (gtag.js) - Google Analytics