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. 20145215《网络对抗》Exp6 信息搜集与漏洞扫描

    20145215<网络对抗>Exp6 信息搜集与漏洞扫描 基础问题回答 哪些组织负责DNS,IP的管理? 全球根服务器均由美国政府授权的ICANN统一管理,负责全球的域名根服务器.DNS和 ...

  2. Iptables防火墙规则使用

    iptables是组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤.封包重定向和网络地址转换(NAT)等功能 ...

  3. Prometheus MySQL_exporter

    MySQL Exporter mysqld_exporter是用来搜集mysql的性能指标的,适用于mysql5.5及其以上版本 程序安装 下载地址:https://prometheus.io/dow ...

  4. CentOS Linux release 7.3源码安装zabbix

    CentOS Linux release 7.3安装zabbix 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 前言: 我去年用用centos6的环境搭建了一下 zabbix3.0 ...

  5. Windows计划任务提示 0xE0434352 错误

    写了一个计划任务每周去跑一个程序,但是并没有跑,报错是 0xE0434352,应该是没有找到路径(计划任务这么菜的吗)... 解决办法:双击启动程序 写上你当前程序的起始路径 然后在运行一下,就成功了

  6. 小心错误使用EasyUI 让网站性能减半

    先不谈需求,和系统架构,直接上来就被抛来了一个问题----基础性能太差了,一个网页打开要好几秒.我了个天,我听了也简直不敢相信,难道是数据量特别大?还是其中业务逻辑特别复杂? 简单的介绍下,基础系统是 ...

  7. 【推荐】Nginx基础知识之————多模块(非覆盖安装、RTMP在线人数实例安装测试)

    说明:已经安装好的nginx,需要添加一个未被编译安装的模块,需要怎么弄呢? 具体:这里以安装第三方nginx-rtmp-module和nginx-accesskey-2.0.3模块为例,nginx的 ...

  8. 转--python 面试题

    # 每一题都值得好好琢磨钻透 [原文地址](http://www.cnblogs.com/Allen-rg/p/7693394.html)1.Python是如何进行内存管理的? 答:从三个方面来说,一 ...

  9. 为什么选择图形数据库,为什么选择Neo4j?

    最近在抓取一些社交网站的数据,抓下来的数据用MySql存储.问我为什么用MySql,那自然是入门简单,并且我当时只熟悉MySql.可是,随着数据量越来越大,有一个问题始终困扰着我,那就是社交关系的存储 ...

  10. d2-admin中那些不错的技巧

    d2-admin基于vue-cli3 路由相关 刷新路由,参照官方  组件内的守卫 但是搞不明白为何加了句 render:h => h() { path: 'refresh', name: 'r ...