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之源码的更多相关文章

  1. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  2. 【深入浅出jQuery】源码浅析2--奇技淫巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  3. 【学】jQuery的源码思路1——后代选择器

    jQuery的源码思路1--后代选择器 这里探讨一下jQuery中后代选择器的封装原理,并自己写一下 getEle('#div1 ul li .box');接受的参数就是个后代选择器,类似于这样: # ...

  4. 深入分析,理解jQuery.Deferred源码

    前言: 如果你对jQuery.Callback回调对象不了解,或者只掌握其方法,但是没有通过阅读源码理解,可以先阅读 前一章jQuery.Callbacks源码解读二,因为只有完全理解jQuery.C ...

  5. jQuery.Callbacks 源码解读二

    一.参数标记 /* * once: 确保回调列表仅只fire一次 * unique: 在执行add操作中,确保回调列表中不存在重复的回调 * stopOnFalse: 当执行回调返回值为false,则 ...

  6. (转)【深入浅出jQuery】源码浅析2--奇技淫巧

    [深入浅出jQuery]源码浅析2--奇技淫巧 http://www.cnblogs.com/coco1s/p/5303041.html

  7. 【深入浅出jQuery】源码浅析2--使用技巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  8. jQuery.attributes源码分析(attr/prop/val/class)

    回顾 有了之前的几篇对于jQuery.attributes相关的研究,是时候分析jQuery.attr的源码了 Javascript中的attribute和property分析 attribute和p ...

  9. 【学】jQuery的源码思路2——$符号是如何封装的

    jQuery中的$符号功能很强大,原因在于对函数参数的个数以及种类的控制,还有对于面向对象思想的运用 function jQuery(args){ //接受参数,并对其判断 this.elements ...

  10. jQuery.queue源码分析

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong ) 队列是一种特殊的线性表,它的特殊之处在于他只允许在头部进行删除,在尾部进行插入.常用来表示先进先出的操作(FI ...

随机推荐

  1. SQL Server 关于CROSS APPLY 和 OUTER APPLY应用

    先看看语法: <left_table_expression>  {cross|outer} apply<right_table_expression> 再让我们了解一下appl ...

  2. django 403问题

    C:\Users\x\pyp1>python manage.py runserverPerforming system checks... System check identified no ...

  3. 错误提示 nginx: [emerg] unknown directive "gzip_static"

    1.检查nginx配置文件错误提示如下: [root@server nginx]# /applications/nginx/sbin/nginx -t -c /applications/nginx/n ...

  4. linux 出现ping,错误提示:connect :network is unreachable

    今天克隆Centos7后  修改IP地址 修改前: IP:172.16.0.198   默认网关:172.16.0.254 修改后: IP:172.16.1.100  默认网关:172.16.0.25 ...

  5. python---基于memcache的自定义session类

    import config import hashlib import time import memcache import json conn = memcache.Client(["1 ...

  6. 关于Meta标签的一些知识

    1.定义文档的编码格式(H5的标准写法) <meta charset="UTF-8"> 2.声明指定的浏览器以及版本 <meta http-equiv=" ...

  7. luogu P4074 [WC2013]糖果公园

    传送门 这种题显然要用树上莫队 何为树上莫队?就是在树上跑莫队算法就是先把树分块,然后把询问离线,按照左端点所在块为第一关键字,右端点所在块为第二关键字,时间戳(如果有修改操作)为第三关键字排序,然后 ...

  8. Adroid反编译资料收集

    Android反编译神器jadx的使用 https://blog.csdn.net/Fisher_3/article/details/78654450 Android 反编译利器,jadx 的高级技巧 ...

  9. js给<img>的src赋值

    用js原生方法:document.getElementById("imageId").src = "xxxx.jpg";用Jquery方法:$("#i ...

  10. UML入门[转]

    访问权限控制 class Dummy { - private field1 # protected field2 ~ package method1() + public method2() } Al ...