jquery之源码
1.插件扩展机制
所有的Jquery代理对象的实例,都是扩展自$.fn对象的
意味着只要我们继续扩展$.fn这个对象的功能,就相当于扩展了所有的Jquery代理对象的实例的功能
代码
var $body=$(document.body);
// console.log($body)
console.log($.fn.addClass===$body.addClass) $body.prototype=$.fn $.fn.run = function(){
console.log(this) //谁调用这个方法,This就代表谁
}
2.插件扩展机制的实现原理
所有jquery核心函数返回的代理对象的构造器的原型就是$.fn
* 构造器和对象的概念
* 注意:只要看到new关键字,一定是在堆中创建了一块空间
代码:展示jquery的原理
//Proxy是代理对象
//构造函数
function Proxy(seleector) { }
function $(seleector) {
return new Proxy(seleector)
} $.fn = Proxy.prototype = {
addClass : function () {
console.log("this is addClass")
},
removeClass :function () {
console.log("this is removeClss")
}
} // Proxy.prototype = $.fn var $body = $(document.body) $body.addClass()
$body.removeClass()
3、
//扩展功能(jquery里面就是这么写的,当然这个比较简单,就是用来理解的,实际应用中,
// 不需要写这个方法)
$.extend = function (target) {
// console.log(target)
for(var i=0;i<arguments.length;i++){
// console.log(arguments[i])
for(var prop in arguments[i]){
console.log(target[prop])
target[prop] = arguments[i][prop]
}
}
}
$.fn.dnList = function (options) {
//默认代码
var _def_ = {
data: [],
p1 : 0,
p2 : 0,
p3 : false
}; var _prop_ = { };
//this代表调用的当前对象 使用$.extend,传入的参数会覆盖默认的相应参数,一一对应的
$.extend(this,_def_,options,_prop_);
var $ul=$("<ul></ul>");
for(var i=0;i<this.data.length;i++){
$ul.append($("<li>"+this.data[i]+"</li>"))
}
this.append($ul); } var $plug = $(".dn-liat-plug");
$plug.dnList({
data : ["张飞s","赵云"]
});
运行结果:

4、
html
<div id="dn-liat-plug" class="dn-liat-plug"></div>
<div id="dn-liat-plug1" class="dn-liat-plug1"></div>
jQuery调用
var $plug = $(".dn-liat-plug");
$plug.dnList({
data : ["张飞s","赵云"]
});
new dnList({
dom:document.getElementById("dn-liat-plug1"),
data:["zhang","yan"]
})
引入插件
//工厂模式
(function (root,factory,plug) {
//jquery===$
//root.jQuery这个是传入jquery对象的原型
//为什么用这种方式?
//因为在不同的系统中,无法保证传进来的是window这个作用域,有可能是其他的作用域
//我们只要关心传进来的是有jquery对象就可以,jquery对象它的上下文不见得一定要在window里面
root[plug] = factory(root.jQuery,plug);
})(window,function ($,plug) {
var _def_ = {
data : [],
p1 : ,
p2 : "",
p3 : false
};
var _prop_ = {
_init : function () {
var $ul=$("<ul></ul>");
for (var i = ;i < this.data.length; i++){
$ul.append($("<li>"+this.data[i]+"</li>"))
}
this.append($ul);
}
} //下面提供了俩中调用方法的写法 //这个是为了jquery调用写的
$.fn[plug] = function (options) {
$.extend(this,_def_,options,_prop_)
this._init();
// console.log(this) //谁调用这个方法,this就指向谁
} //这个是为了new而写的,配合的是最上面的root[plug]
return function (options) {
var dom = options.dom; //调用函数的目标,DOM对象
$(dom)[plug].call($(dom),options)
}
},"dnList")
显示结果

jquery之源码的更多相关文章
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 【深入浅出jQuery】源码浅析2--奇技淫巧
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 【学】jQuery的源码思路1——后代选择器
jQuery的源码思路1--后代选择器 这里探讨一下jQuery中后代选择器的封装原理,并自己写一下 getEle('#div1 ul li .box');接受的参数就是个后代选择器,类似于这样: # ...
- 深入分析,理解jQuery.Deferred源码
前言: 如果你对jQuery.Callback回调对象不了解,或者只掌握其方法,但是没有通过阅读源码理解,可以先阅读 前一章jQuery.Callbacks源码解读二,因为只有完全理解jQuery.C ...
- jQuery.Callbacks 源码解读二
一.参数标记 /* * once: 确保回调列表仅只fire一次 * unique: 在执行add操作中,确保回调列表中不存在重复的回调 * stopOnFalse: 当执行回调返回值为false,则 ...
- (转)【深入浅出jQuery】源码浅析2--奇技淫巧
[深入浅出jQuery]源码浅析2--奇技淫巧 http://www.cnblogs.com/coco1s/p/5303041.html
- 【深入浅出jQuery】源码浅析2--使用技巧
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- jQuery.attributes源码分析(attr/prop/val/class)
回顾 有了之前的几篇对于jQuery.attributes相关的研究,是时候分析jQuery.attr的源码了 Javascript中的attribute和property分析 attribute和p ...
- 【学】jQuery的源码思路2——$符号是如何封装的
jQuery中的$符号功能很强大,原因在于对函数参数的个数以及种类的控制,还有对于面向对象思想的运用 function jQuery(args){ //接受参数,并对其判断 this.elements ...
- jQuery.queue源码分析
作者:禅楼望月(http://www.cnblogs.com/yaoyinglong ) 队列是一种特殊的线性表,它的特殊之处在于他只允许在头部进行删除,在尾部进行插入.常用来表示先进先出的操作(FI ...
随机推荐
- JavaSE学习总结(十九)—— Java Web 综合应用(JSP、Servlet、IDEA、MySQL、JUnit、AJAX、JSON)
一.使用Servlet+JDBC+MySQL+IDEA实现商品管理 1.1.创建项目 打开IntelliJ IDEA开发工具.点击Create New Project创建一个新的Web项目 选择Jav ...
- hdu 4685(强连通分量+二分图的完美匹配)
传送门:Problem 4685 https://www.cnblogs.com/violet-acmer/p/9739990.html 参考资料: [1]:二分图的最大匹配.完美匹配和匈牙利算法 [ ...
- 文本框JTextField,密码框JPasswordField
1.文本框JTextField public class Demo extends JFrame { public Demo() { setBounds(100, 100, 200, 120); se ...
- [持续更新] 文章列表 Last Update: 8/21/2017
1.前端 HTML5快速学习二 Canvas@20141125 HTML5快速学习一@20141122 2.ASP.NET(MVC) MVC5+EF6 完整教程17--升级到EFCore2.0@201 ...
- 高效的SQLSERVER分页查询
Sqlserver数据库分页查询一直是Sqlserver的短板,闲来无事,想出几种方法,假设有表ARTICLE,字段ID.YEAR...(其他省略),数据53210条(客户真实数据,量不大),分页查询 ...
- scatter
一.matplotlib.pyplot.scatter用来画散点图 import matplotlib.pyplot as plt import matplotlib as mpl mpl.rcPar ...
- Word不能添加目录?
我复制粘贴了一大把文字,标题也设置了,就是添加不了目录,也不知道是什么原因. 后来同事给我指点了一下,真是万分感激啊 比如下面这张图,第13章那么大的标题在那里,但是就是添加不了目录 原因是在于换行的 ...
- Java编程思想 学习笔记4
四.控制执行流程 1.true和false 所有条件语句都利用条件表达式的真或假来决定执行路径.注意Java不允许我们将一个数字作为布尔值使用. 2.if-else 3.迭代 while.do-whi ...
- 浅谈分词算法(3)基于字的分词方法(HMM)
目录 前言 目录 隐马尔可夫模型(Hidden Markov Model,HMM) HMM分词 两个假设 Viterbi算法 代码实现 实现效果 完整代码 参考文献 前言 在浅谈分词算法(1)分词中的 ...
- 〖C语言学习笔记 〗(二) 数据类型
前言 本文为c语言的学习笔记,很多只是留下来占位的 数据类型 助记:变量就是在内存中挖个坑并给这个坑命名,而数据类型就是挖内存的坑的尺寸 基础类型 整数类型: short int int long i ...