2011-10-11 40 views
15

讓我們想象的功能是這樣的:如何在JavaScript中創建可鏈接的函數?

function foo(x) { 
    x += '+'; 
    return x; 
} 

它的用法是這樣的:

var x, y; 
x = 'Notepad'; 
y = foo(x); 
console.log(y); // Prints 'Notepad+'. 

我正在尋找一種方法來創建功能這是可鏈接的其他功能。

想象用法:

var x, y; 
x = 'Notepad'; 
y = x.foo().foo().toUpperCase(); // Prints 'NOTEPAD++'. 
console.log(y); 

我會怎麼做呢?

回答

14

當然,關鍵是要返回對象一旦你完成修改它:

String.prototype.foo = function() { 
    return this + "+"; 
} 

var str = "Notepad"; 
console.log(str.foo().foo().toUpperCase()); 

http://jsfiddle.net/Xeon06/vyFek/

如果要對String可用的方法,我在修改它的原型。儘管如此,請注意不要在Object上這樣做,因爲枚舉屬性時可能會導致問題。

+3

這是一個好主意,至少在添加它之前檢查本地類型的屬性,即'if(!('('foo'in String.prototype)){String.prototype.foo = function(){.. 。}}' – keeganwatkins

+0

如果你想在不破壞枚舉的情況下擴展一個對象,可以使用(semi-modern)['Object.defineProperty'](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/ Object/defineProperty):'Object.defineProperty(String.prototype,{value:function(){return this +「+」;}})'。默認情況下,'enumerable'標誌被設置爲'false'。 – Phrogz

+0

@keeganwatkins是的,它是:)。我認爲OP只是以字符串作爲例子,所以我儘量保持警告,但這是一個很好的觀點。 –

6

如果我沒有記錯,可以使用「this」作爲函數的上下文(它所屬的對象)並返回它以使函數可鏈接。換句話說:

var obj = 
{ 
    f1: function() { ...do something...; return this;}, 
    f2: function() { ...do something...; return this;} 
} 

那麼你可以鏈狀obj.f1().f2()

來電請記住,你將無法實現,你可以通過調用obj.f1()期待什麼toUpperCase()。 - 它將執行f1(),返回「this」並嘗試調用obj.toUpperCase()。