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 ...
随机推荐
- 设计模式---对象创建模式之抽象工厂模式(Abstract Factory)
一:概念 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的.抽象工厂模式可以向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对象 二:动机 在软件系统 ...
- Linux 内核 hlist 详解
在Linux内核中,hlist(哈希链表)使用非常广泛.本文将对其数据结构和核心函数进行分析. 和hlist相关的数据结构有两个:hlist_head 和 hlist_node //hash桶的头结点 ...
- JAVA记录-添加错误页面友好提示
1.web.xml加入以下配置 <error-page> <error-code>404</error-code> <location>/WEB-INF ...
- Ruby 集合数组常用遍历方法
迭代器简介 先简单介绍一下迭代器. 1.一个Ruby迭代器就是一个简单的能接收代码块的方法(比如each这个方法就是一个迭代器).特征:如果一个方法里包含了yield调用,那这个方法肯定是迭代器: 2 ...
- AES加密【转】
. 此时就一定要使用如下代码步骤 : 1.SecureRandom的key定下来. SecureRandom 实现完全隨操作系统本身的內部狀態,除非調用方在調用 getInstance 方法之後又 ...
- Log4j Threshold属性指定输出等级
有时候我们需要把一些报错ERROR日志单独存到指定文件 ,这时候,Threshold属性就派上用场了: Threshold属性可以指定日志level Log4j根据日志信息的重要程度,分OFF.FAT ...
- authentication failed for xxx错误
现象: 公司windows定期修改过密码后 一直报错.push的时候显示“Authentication Failed for http://x.x.x.x/x/git” 猜想: 发现可能是账号问题. ...
- Servlet总结(一)
一.Servlet了解 1.Servlet全称Java Servlet,是用java编写的独立于平台和协议的服务器端应用程序,运行于服务器,采用请求-响应模式提供Web服务 2.Servlet实现过程 ...
- SysTick_CLKSourceConfig 这个函数
systick的寄存器说明是在<Cortex M3权威指南>里说明了! 其实是有选择的,只是默认是AHB/8.通过设置systick的CTRL寄存器的bit2来设置时钟,设置如下: bit ...
- Spring第一个helloWorld
Spring 简介: 轻量级:Spring是非侵入性的-基于Spring开发的应用中的对象可以不依赖于Spring的API 依赖注入(DI—dependdency injection.IOC) 面向切 ...