jquery之源码

1.插件扩展机制

    所有的Jquery代理对象的实例,都是扩展自$.fn对象的

    意味着只要我们继续扩展$.fn这个对象的功能,就相当于扩展了所有的Jquery代理对象的实例的功能

代码

1  var $body=$(document.body);
2       //  console.log($body)
3      console.log($.fn.addClass===$body.addClass)
4 
5 $body.prototype=$.fn
6 
7 $.fn.run = function(){
8     console.log(this)  //谁调用这个方法,This就代表谁
9  }

2.插件扩展机制的实现原理
所有jquery核心函数返回的代理对象的构造器的原型就是$.fn
* 构造器和对象的概念
* 注意:只要看到new关键字,一定是在堆中创建了一块空间

代码:展示jquery的原理

 1 //Proxy是代理对象
//构造函数
2 function Proxy(seleector) { 3 4 } 5 function $(seleector) { 6 return new Proxy(seleector) 7 } 8 9 $.fn = Proxy.prototype = { 10 addClass : function () { 11 console.log("this is addClass") 12 }, 13 removeClass :function () { 14 console.log("this is removeClss") 15 } 16 } 17 18 // Proxy.prototype = $.fn 19 20 var $body = $(document.body) 21 22 $body.addClass() 23 $body.removeClass()

 3、

 1 //扩展功能(jquery里面就是这么写的,当然这个比较简单,就是用来理解的,实际应用中,
 2 // 不需要写这个方法)
 3     $.extend = function (target) {
 4 //        console.log(target)
 5         for(var i=0;i<arguments.length;i++){
 6          //  console.log(arguments[i])
 7             for(var prop in arguments[i]){
 8                 console.log(target[prop])
 9                 target[prop] = arguments[i][prop]
10             }
11         }
12     }
13    $.fn.dnList = function (options) {
14       //默认代码
15       var _def_ = {
16           data: [],
17           p1 : 0,
18           p2 : 0,
19           p3 : false
20       };
21 
22       var _prop_ = {
23 
24       };
25       //this代表调用的当前对象  使用$.extend,传入的参数会覆盖默认的相应参数,一一对应的 
26       $.extend(this,_def_,options,_prop_);
27       var $ul=$("<ul></ul>");
28       for(var i=0;i<this.data.length;i++){
29           $ul.append($("<li>"+this.data[i]+"</li>"))
30       }
31       this.append($ul);
32 
33    }
34 
35    var $plug = $(".dn-liat-plug");
36    $plug.dnList({
37        data : ["张飞s","赵云"]
38    });

运行结果:

 4、

html

1 <div id="dn-liat-plug" class="dn-liat-plug"></div>
2 <div id="dn-liat-plug1" class="dn-liat-plug1"></div>

jQuery调用

1  var $plug = $(".dn-liat-plug");
2    $plug.dnList({
3        data : ["张飞s","赵云"]
4    });
5 
6    new dnList({
7        dom:document.getElementById("dn-liat-plug1"),
8        data:["zhang","yan"]
9    })

引入插件

 1 //工厂模式
 2 (function (root,factory,plug) {
 3     //jquery===$
 4     //root.jQuery这个是传入jquery对象的原型
 5     //为什么用这种方式?
 6     //因为在不同的系统中,无法保证传进来的是window这个作用域,有可能是其他的作用域
 7     //我们只要关心传进来的是有jquery对象就可以,jquery对象它的上下文不见得一定要在window里面
 8    root[plug] = factory(root.jQuery,plug);
 9 })(window,function ($,plug) {
10     var _def_ = {
11         data : [],
12         p1 : 0,
13         p2 : "",
14         p3 : false
15     };
16     var _prop_ = {
17         _init : function () {
18             var $ul=$("<ul></ul>");
19             for (var i = 0;i < this.data.length; i++){
20                 $ul.append($("<li>"+this.data[i]+"</li>"))
21             }
22             this.append($ul);
23         }
24     }
25 
26     //下面提供了俩中调用方法的写法
27 
28     //这个是为了jquery调用写的
29     $.fn[plug] = function (options) {
30         $.extend(this,_def_,options,_prop_)
31         this._init();
32         // console.log(this)  //谁调用这个方法,this就指向谁
33     }
34 
35     //这个是为了new而写的,配合的是最上面的root[plug]
36     return function (options) {
37         var dom = options.dom;  //调用函数的目标,DOM对象
38         $(dom)[plug].call($(dom),options)
39     }
40 },"dnList")

显示结果

原文地址:https://www.cnblogs.com/zhaobao1830/p/6581949.html