2017-04-27 105 views
6

我試圖創建一個可以支持方法鏈接的迷你jQuery克隆。到目前爲止,我想出了這樣一段代碼:jQuery對象數據結構

var $ = (function() { 

    var elements = []; 

    function methodOne() { 
    console.log('Method 1'); 
    return this; 
    } 

    function methodTwo() { 
    console.log('Method 2'); 
    return this; 
    } 

    return { 
    methodOne: methodOne, 
    methodTwo: methodTwo 
    }; 
}()); 

在網頁加載時,$變量被由IIFE返回jQuery的克隆對象的填充。

我的問題是,我怎樣才能使$對象作爲一個函數直接調用,同時仍然保持方法鏈接功能?

現在,我可以使用$.methodOne().methodTwo(),但我不能像使用jQuery一樣使用$('some parameter').methodOne().methodTwo()

+0

我還沒有嘗試過,但我認爲你可以使用'class' javascript和'extends' Jquery!我認爲這樣做。你知道,我很好奇,我也會嘗試。 – funcoding

回答

3

var $ = function (param) { 
 

 
    var elements = []; 
 
    console.log(param); 
 

 
    function methodOne() { 
 
    console.log('Method 1'); 
 
    return this; 
 
    } 
 

 
    function methodTwo() { 
 
    console.log('Method 2'); 
 
    return this; 
 
    } 
 

 
    return { 
 
    methodOne: methodOne, 
 
    methodTwo: methodTwo 
 
    }; 
 
}; 
 

 
$('This is a param').methodOne().methodTwo();

1

Working fiddle。評論應該或多或少地自我解釋。

它可能看起來有點長,但它可以讓你每次調用它時創建新的迷你jQuery對象。

var _ = (function() { 

    var Magic = function(query){ 
     if(window === this) 
      return new Magic(query); 

     // reference to itself 
     var that = this; 

     //assign pseudo public methods and variables 
     that.elements = []; 
     that.methodTwo = methodTwo; 
     that.methodOne = methodOne; 

     //fills inner element array with DOM element 
     _get(query); 

     function _get(query){ 
      var elem = document.getElementById(query); 
      that.elements.push(elem); 
     } 

     function methodOne() { 
      console.log('Method 1'); 
      return that; 
     } 

     function methodTwo() { 
      console.log('Method 2', that.elements); 
      return that; 
     } 

     return this; 
    } 

    //returns function, which is assigned to a "_" variable 
    return function(query){ 
     //everytime "_" is called, it will return new instance for object Magic which makes all the work 
     return new Magic(query); 
    } 

}());