javascript - recorrer - ¿Cómo encadenar funciones sin usar prototipos?
this javascript (4)
La sintaxis de puntos está reservada para objetos. Entonces puedes hacer algo como
function MyNumber(n) {
var internal = Number(n);
this.one = function() {
internal += 1;
// here comes the magic that allows chaining:
return this;
}
// this.two analogous
this.valueOf = function() {
return internal;
}
}
new MyNumber(5).one().two().two().valueOf(); // 10
O vas a implementar estos métodos en el prototipo del objeto / función nativo Número. Eso permitiría (5).one()...
Tengo muchas funciones útiles que he recopilado durante toda mi vida.
function one(num){
return num+1;
}
function two(num){
return num+2;
}
Puedo llamarlos con two(two(one(5)))
Pero preferiría usar (5).one().two().two()
¿Cómo puedo lograr esto sin usar un prototipo?
Traté de ver cómo funciona la cadena de subrayado, pero su código es demasiado intenso para entenderlo
Para evitar tener que llamar a toValue
al final de la cadena como en la solución de @ Bergi, puede usar una función con métodos adjuntos. JS llamará toValue
automáticamente cuando intente convertirlo en un tipo primitivo.
function MyNumber(n) {
function x () { }
x.one = function() { n++; return this; };
x.valueOf = function() { return n; };
return x;
}
Entonces,
MyNumber(5).one().one()
> 7
Una alternativa agradable y general es crear una función de composición de función personalizada
var go = function(x, fs){
for(var i=0; i < fs.length; i++){
x = fs[i](x);
}
return x;
}
Puedes llamarlo así:
go(5, [one, two, two])
Personalmente, no soy un gran admirador del método de encadenamiento, ya que lo restringe a un conjunto predefinido de funciones y existe una especie de desajuste de impedancia entre los valores dentro del "objeto de encadenamiento" y los valores libres externos.
Otra alternativa es usar la función de flujo lodash . Por ejemplo:
var five = _.flow(one, two, two)
five(5)
Prefiero asignar una nueva cadena a una variable. Le da un nombre claro y fomenta la reutilización.
Por cierto, lodash también ayuda a pasar argumentos adicionales a las funciones de la cadena. Por ejemplo:
var addFive = _.flow(
_.partialRight(_.add, 1),
_.partialRight(_.add, 2),
_.partialRight(_.add, 2)
)
Hay muchas otras funciones útiles para ayudar en el encadenamiento funcional, por ejemplo, parcial , spread , flip , negate , etc.