Jquery實現(xiàn)$.fn.extend和$.extend函數(shù)

字號:


    這篇文章主要介紹了Jquery實現(xiàn)$.fn.extend和$.extend函數(shù)的相關(guān)資料,需要的朋友可以參考下
    先來看看這兩個函數(shù)的區(qū)別:
      $.fn.extend是為查詢的節(jié)點對象擴(kuò)展方法,是基于$的原型擴(kuò)展的方法
      $.extend是擴(kuò)展常規(guī)方法,是$的靜態(tài)方法。
    我們之前寫的代碼看一下:    
    (function (win) {
       var _$ = function (selector, context) {
         return new _$.prototype.Init(selector, context);
       }
       _$.prototype = {
         Init: function (selector, context) {
         },
         each: function (callback) {
         }      
       }
       _$.prototype.Init.prototype = _$.prototype;       
       window.$ = window.JQuery = _$;
     })(window);
    這個是主體的代碼。
    我來先來擴(kuò)展$.fn.extend方法:
     這個方法的初衷是我們擴(kuò)展之后可以用$("").newMetod()這樣訪問,實際上就是給$原型加一個extend方法。這中間的fn其實類似于命名空間的作用,沒什么實際的意義。為的是和 $.extend作區(qū)分。
    熟悉原型的其實一看就知道:讓$.fn指向$的原型不就行了?
    于是我們就有了下面一段代碼: _$.fn = _$.prototype;
    接下來我們就來加上extend方法了:    
    var isObj = function (o) {
        return Object.prototype.toString.call(o) === "[object Object]";
      }
      _$.fn.extend = function (obj) {
        if (isObj(obj)) {
          for (var i in obj) {
            this[i] = obj[i];
          }
        }
      }
     這段代碼中isObj的作用是判斷傳入的參數(shù)是不是object對象, _$.fn.extend      這個方法其實和_$.prototype.extend 一樣的,大家看一下,這個代碼可能和JQUERY源碼不太一樣,我是按照自己的意思寫的。
    下面我們來實現(xiàn)$.extend方法,剛才已經(jīng)說過了,這個方法其實是為$加一個靜態(tài)方法,代碼如下:
    $.extend = function (obj) {
        if (isObj(obj)) {
          for (var i in obj) {
            this[i] = obj[i];
          }
        }
      }
      你會發(fā)現(xiàn)兩個方法是一樣的,不過你仔細(xì)琢磨一下,是不一樣的:
      _$.fn.extend里面的this其實是代表$.prototype,  $.extend 里面的this代表的是$。
    這兩個方法我們實現(xiàn)了,奉上全部代碼: 
    (function (win) {
         var _$ = function (selector, context) {
           return new _$.prototype.Init(selector, context);
         }
         _$.prototype = {
           Init: function (selector, context) {
           },
           each: function (callback) {
           }
         }
         _$.prototype.Init.prototype = _$.prototype;
         _$.fn = _$.prototype;
         var isObj = function (o) {
           return Object.prototype.toString.call(o) === "[object Object]";
         }
         _$.fn.extend = function (obj) {
           if (isObj(obj)) {
             for (var i in obj) {
               this[i] = obj[i];
             }
           }
         }
         _$.extend = function (obj) {
           if (isObj(obj)) {
             for (var i in obj) {
               this[i] = obj[i];
             }
           }
         }
         window.$ = window.JQuery = _$;
       })(window);
    使用方法其實就是:
    $.fn.extend(
    {
       method:function(){
    }
    })
    $.extend(
    {
       method:function(){
    }
    })
    代碼和Jquery源碼不一樣,我這是為了簡化寫的方法,大家主要是要琢磨里面的思想,謝謝大家的閱讀。