作者: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的核心概念和常用功能。 ### 1. jQuery选择器 jQuery的选择器基于CSS,它允许开发者高效地选取HTML元素。例如,`$("#myID")`选择具有特定ID的元素,`$(".myClass")`选择所有带有指定类名的...
非常好用的jquery核心库文件
jQuery的核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的css选择器,并且可对CSS选择器进行扩展;拥有便捷的插件扩展机制和丰富的插件。jQuery兼容各种主流浏览器,如IE 6.0+、FF ...
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的核心包1.4.2,它是jQuery历史上的一个重要版本,为开发者提供了丰富的功能和高效的性能。 1. **基础概念与安装** jQuery 1.4.2 是一个轻量级的库,可以通过下载压缩包或使用CDN...
本文将从核心概念、设计模式、主要功能模块等方面进行详尽的jQuery源码分析。 1. **核心概念** - **选择器引擎Sizzle**:jQuery的核心是其高效的选择器引擎Sizzle,它基于CSS选择器实现,能够快速准确地定位DOM...
《jQuery带事件记录的多功能日历详解》 在网页开发中,日历插件是一种常见的交互元素,用于显示日期、安排事件以及提醒用户。本文将深入探讨一款特别的jQuery日历插件,它具备事件记录功能,使得日历不仅美观,而且...
本篇文章将深入解析名为"jQuery多功能搜索框插件下拉菜单选择代码"的项目,通过分析压缩包中的文件,揭示其工作原理和实现方式。 首先,项目中包含的主要CSS文件有`bootstrap.min.css`和`jquery.dropdown.css`。`...
### jQuery 1.4.3 源码分析(核心部分) #### 一、引言 随着 Web 技术的不断发展,JavaScript 成为了前端开发中不可或缺的一部分。而在众多 JavaScript 库中,jQuery 几乎成为了网页开发的标准工具之一。本文将...
### jQuery源码分析系列知识点概览 #### 一、总体架构与核心概念 - **前言开光**:介绍分析jQuery源码的目的和价值,强调通过深入研究源码,可以学习到先进的设计理念和实践技巧。 - **总体架构**:解析jQuery的...
jQuery对象分析其运行状态以了解出错的原因。 如果对于 web 的应用的页面运行性能和效率有所要求的话,那么我们更应 该去明白其运行机理和核心源码。但是 jQuery 源码不像其它的类库那样,它有 点晦涩,难懂。这...
本文将深入分析jQuery.js的核心执行流程,帮助读者理解其内部机制,尤其是jQuery如何利用构造函数和原型链实现其强大的功能。 #### 二、jQuery的基础构建 1. **防止重复加载**: 在jQuery的加载过程中,首先会...
在jQuery 1.4.3版本中,其核心部分主要包括选择器引擎、DOM操作、事件处理和函数封装等关键功能。 首先,jQuery的初始化过程始于`jQuery = (function(){ ... })()`,这是一个立即执行的函数表达式(IIFE),确保了...
**jQuery 1.2.6 源码分析教程** jQuery 是一个广泛使用的 JavaScript 库,因其简洁的语法和强大的功能而备受开发者喜爱。在 jQuery 1.2.6 版本中,虽然它已经相对老旧,但其背后的实现原理和优化策略仍然值得深入...
Jquery1.2.6源码分析及源码文件 博文链接:https://jljlpch.iteye.com/blog/234218
《jQuery源码详细分析中文注释》是一份深入解析jQuery库源码的宝贵资源,它为开发者提供了理解这个广泛使用的JavaScript库内部工作机制的机会。jQuery以其简洁的API和强大的功能深受前端开发者的喜爱,但其背后的...
"jquery网站功能引导用户提示操作"就是一种实现这一目标的技术手段。jQuery,一个广泛使用的JavaScript库,提供了丰富的功能和简单易用的API,使得创建这种用户引导提示变得轻而易举。 首先,我们需要理解jQuery的...
jQuery UI实际上是jQuery插件,专指由jQuery官方维护的UI方向的插件 jQuery UI 与 jquery 的主要区别是: (1) jQuery是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等。 (2) jQuery UI则是在jQuery的...
这个“jQuery核心讲解帮忙文档”是专为初学者设计的,旨在帮助他们快速掌握jQuery的基本概念和核心功能。 ### 1. jQuery选择器 jQuery的选择器基于CSS选择器,使得选取DOM元素变得简单。例如,`$("#id")`用于选取...