Comment faire chainable fonction en JavaScript?
Permet d'imaginer la fonction comme ceci:
function foo(x) {
x += '+';
return x;
}
L'utilisation de ce serait comme:
var x, y;
x = 'Notepad';
y = foo(x);
console.log(y); //Prints 'Notepad+'.
Je suis à la recherche d'un moyen de créer une fonction qui est chainable avec d'autres fonctions.
Imaginer utilisation:
var x, y;
x = 'Notepad';
y = x.foo().foo().toUpperCase(); //Prints 'NOTEPAD++'.
console.log(y);
Comment puis-je faire?
OriginalL'auteur daGrevis | 2011-10-11
Vous devez vous connecter pour publier un commentaire.
Sûr, le truc, c'est de retourner l'objet une fois que vous avez terminé de modifier:
http://jsfiddle.net/Xeon06/vyFek/
Pour rendre la méthode disponible sur
String
, je suis à la modification du prototype. Attention de ne pas le faire surObject
cependant, car il peut causer des problèmes lors de l'énumération plus de leurs propriétés.if ( !('foo' in String.prototype) ) {String.prototype.foo = function() {...} }
Si vous voulez prolonger un objet sans rupture de l'énumération, de l'utilisation de la (semi-moderne)
Object.defineProperty
:Object.defineProperty( String.prototype, {value:function(){ return this+"+"; } } )
. Par défaut, leenumerable
indicateur est défini àfalse
.oui, ça l'est :). Je suppose que l'OP a été de demander seulement sur les chaînes de caractères comme un exemple, j'ai donc gardé les avertissements à un minimum, mais c'est un bon point.
La bonne solution, la mienne était trop générique
Vous ne pouvez pas affecter de
this
dans une chaîne de caractères. Retourner le résultat au lieu de cela. Si vous avez besoin de faire de multiples opérations, de le stocker dans une variable temporaire et de retour à la place. Par exemple,var str = this; str += "foo"; return str;
OriginalL'auteur Alex Turpin
Si je me souviens correctement, vous pouvez utiliser "ce" en tant que contexte d'une fonction (objet auquel elle appartient) et de le retourner à rendre la fonction de chaînage. En d'autres termes:
ensuite, vous pouvez chaîner les appels comme
obj.f1().f2()
Gardez à l'esprit, vous ne serez pas en mesure de réaliser ce que vous attendez en appelant obj.f1().toUpperCase() - il va exécuter f1(), le retour de "ce" et va essayer de l'appeler obj.toUpperCase().
OriginalL'auteur Andrey