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")
显示结果