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. @DisallowConcurrentExecution 注解的作用 【定时器执行完当前任务才开启下一个线程的方式】

    转: @DisallowConcurrentExecution 注解的作用 2018年10月12日 16:42:40 fly_captain 阅读数:4317   Quartz定时任务默认都是并发执行 ...

  2. HTML:<input type="text">文本框不可编辑的方式

    1.<input type="text" name="name" value="姓名" disabled /> 该方式显示的文本 ...

  3. 使用博客系统发生_STORAGE_WRITE_ERROR_错误

    因为本人有自己的vps正好又最近学习了网络的搭建,但是呢不是一番风顺的在假设好PHP.http和MySQL后吧一个博客系统放进去后出现了以下问题 好吧== 出来了这个问题到是让我看了半天,然后查了查说 ...

  4. Spring(2)

    前言:控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依 ...

  5. Spark进阶之路-Spark提交Jar包执行

    Spark进阶之路-Spark提交Jar包执行 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在实际开发中,使用spark-submit提交jar包是很常见的方式,因为用spark ...

  6. linux的一个find命令配合rm删除某天前的文件

    语句写法: find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; 例1: 将/usr/local/backups目录下所有10天前 ...

  7. 学习windows编程 day4 之 绘制随机矩形和peekMessage

    #include <windows.h> #include <strsafe.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT messa ...

  8. Python复习笔记(二)变量进阶

    02. 可变和不可变类型 不可变类型,内存中的数据不允许被修改: 数字类型 int , bool , float , complex , long(2.x) 字符串 str 元组 tuple 可变类型 ...

  9. C# Winform继承窗体打开设计器白屏的一例解决方法

    环境VS2017 15.5.4,Win10开发过程中,发现一些窗体打开设计器会卡死白屏,另外有一些不会,(两者运行时正常),最小化vs后甚至能把工具箱连带搞黑,严重影响开发效率,经过一天多的对比研究, ...

  10. IDEA不生成WAR包,报错

    com.intellij.javaee.oss.admin.jmx.JmxAdminException: com.intellij.execution.ExecutionExceptionProjec ...