2011-03-19 56 views
3

我一直在開發一個JavaScript庫,類似於Underscore.js和Jquery在過去幾天。在這兩個庫中,他們使用一個可以接受參數的對象,但也可以調用方法:$(「param」)。method();或_(「param」)。method();創建JavaScript庫關閉

我一直在閱讀這些庫上的源代碼,試圖瞭解他們如何實現這樣的事情,但一直無法弄清楚。我不知道這種封閉類型的名稱,所以我一直無法搜索它。

任何幫助將不勝感激,我只是想弄清楚如何我可以實現這種類型的對象到我的圖書館。

回答

3

你只是做一個函數返回一個具有方法的對象。例如:

function test(demo) { 
    return { 
    show: function() { alert(demo); } 
    }; 
} 

test("Hello world").show(); 
+0

真棒!如果沒有方法被調用,有沒有辦法讓'test'返回一個特定的值而不是方法對象字面值?我試過用旗子做一些事情,但沒有運氣。我需要的是:test(「param」)。method1(「edit param」)。method2(「return param」) – 2011-03-19 23:44:28

0

不要做什麼特別的,只是做一個功能,並添加屬性(其中有些可以是函數):

function a(){ 
    alert(1); 
} 

a.b = function(){ 
    alert(2); 
} 

現在你可以做兩個:

a() 

或:

a.b() 
+0

雖然我不能訪問發送到a()函數中的參數。 – 2011-03-19 22:52:32

+0

@伊法瑞爾:對不起,誤解了這個問題。 – fdreger 2011-03-19 23:07:06

4
var lib = (function (param) { 

    var func = function() { 
    /// your code 

    return { 
     animate : function() { 
      // do the animation 
      return this; 
    } 
    } 

    return func; 
})(); 

你可以使用

lib(function(){}).something(); 
lib("selector").something().something().something(); 
lib(DOMElement).something().something().something(); 

定義

lib.prototype={ 
some: function() {} 
}; 

允許您使用

lib("foo").some(); 
+1

謝謝,非常有幫助... – 2011-08-31 16:59:55