2009-09-16 10 views
3

我想編寫一個小型的JavaScript(框架),可以鏈接功能與所有以下功能知道其前任的數據。什麼是最簡單的方式來實現像jQuery這樣的可鏈接的JavaScript框架?

基本上,我對jQuery提供的膨脹(我意識到它很小,對於我的更小的項目雖然膨脹)並不感興趣,但是想要模仿它的一些行爲 - 主要用於學習目的和數據可用於所有鏈接功能。

我很樂意,例如能夠做這樣的事情:

myJsLib.processForm("user", "pass").url("http://domain.dev/form.php").queryString({ secure: true, errorPage: "login_failure.htm" }); 

在上面的例子中的所有功能,必須意識到在一定程度上什麼其他正在做。

,或者更具體:

myJsLib.getDataIntoArray(jsonObjectOrWhatever).each(function(item) { alert(item); }); 

其中, 「項目」 將是數組getDataIntoArray()創建(返回?)。

我希望我有這個適當的措辭。我試圖讓這個例子太過分了。理解jQuery的原型擴展已被證明是無用的,但我並不熟悉JavaScript。我非常感謝一個詳細的(但愚蠢的)解釋和代碼示例,請。

非常感謝。

編輯:感謝安德魯我能夠拿出一些似乎令人滿意的東西。請糾正我似乎有任何誤解,謝謝。

function myLib() 
{ 
this.properties = ['status', 'window', 'ui'], 
this.inputArrayParms = function(parms) 
{ 
    for (var i = 0, len = parms.length; i < len; i++) 
    { 
     this.properties[this.properties.length] = parms[i]; 
    } 
    return this; 
}, 
this.each = function(callback) 
{ 
    for (var i = 0, len = this.properties.length; i < len; i++) 
    { 
     callback(this.properties[i]); 
    } 
    return this; 
} 
} 

var f = new myLib; 
f.inputArrayParms(["one", "two", "three"]).each(function(theMsg){ alert(theMsg); }); 

這似乎按預期工作。任何警告?

+0

@Brainsick:不需要在標題中添加「已解決」。另外,如果安德魯的答案幫助你解決了你的問題,作爲禮貌,你應該點擊旁邊的複選標記標記他的答案爲可接受的。 – 2009-09-16 04:41:19

+0

Gotcha。非常抱歉! – Brainsick 2009-09-16 05:23:39

+0

您可以用下面的代碼替換執行this.properties [this.properties.length] = parms [i]的for循環:Array.prototype.push.apply(this.properties,parms); – 2009-09-16 05:27:15

回答

5

這叫做fluent interface,創建它的最好方法是讓每個函數返回的單個主對象(如jQuery對象)允許將其他函數調用鏈接在一起。

這裏是一個小例子:

function foo() { 
    this.first = function(first) { 
     alert(first); 
     return this; 
    } 
    this.second = function(second) { 
     alert(second); 
     return this; 
    } 
} 

本通知的foo類有兩個方法,firstsecond。由於這兩種方法返回this它們可以以任意順序進行鏈接,你希望:

new foo().first("hello").second("world"); 
new foo().second("hello").first("world"); 
new foo().first("hello").first("world"); 

你的想法:)

去想流暢接口的一個好方法是,他們更容易流動和,可以說是更容易閱讀。上面的例子僅僅是對於更習慣用法的替代品:

f = new foo(); 
f.first("hello"); 
f.second("world"); 

這意味着,一個流暢的接口並沒有規定任何類的實現超出強制你返回this,這樣的方法調用可以鏈接。這意味着你可以添加字段到這個類中,可以在任何函數中使用,就像任何其他類一樣。

+0

謝謝,安德魯。我會嘗試這種方法,但非常感謝代碼中的一個小例子。 – Brainsick 2009-09-16 03:54:39

+0

這是太棒了,容易理解。謝謝。我怎麼會,例如,我會第二()使用「第一」或在first()中聲明或處理的數組? – Brainsick 2009-09-16 04:15:11

+0

如果我理解正確,我們基本上模仿真實的類,因爲每個「方法」將簡單地指向原始對象的「屬性」。感謝您的協助,並隨時糾正我的缺點。 – Brainsick 2009-09-16 04:32:24

相關問題