Come rendere la funzione concatenabile in JavaScript?

Immaginiamo una funzione come questa:

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

L’uso di esso sarebbe come:

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

Sto cercando un modo per creare una funzione che sia concatenabile con altre funzioni.

Immagina l’uso:

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

Come lo farei?

Certo, il trucco è restituire l’object una volta che hai finito di modificarlo:

 String.prototype.foo = function() { return this + "+"; } var str = "Notepad"; console.log(str.foo().foo().toUpperCase()); 

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

Per rendere il metodo disponibile su String , sto modificando il suo prototipo. Fare attenzione a non farlo su Object , poiché può causare problemi durante l’enumerazione delle proprietà.

Se ricordo bene, puoi usare “questo” come contesto di una funzione (object a cui appartiene) e restituirlo per rendere la funzione concatenabile. In altre parole:

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

quindi puoi concatenare le chiamate come obj.f1().f2()

Tieni presente che non sarai in grado di ottenere ciò che ti aspetti chiamando obj.f1 (). ToUpperCase () – eseguirà f1 (), restituirà “this” e proverà a chiamare obj.toUpperCase ().