tipos - retornar valor de una funcion javascript a php
¿Hay alguna manera de hacer que el retorno de una función sea accesible a través de una propiedad? (4)
Soy un desarrollador de JS, experimentando con ideas de programación funcional, y me pregunto si hay alguna forma de usar cadenas para funciones sincrónicas en la forma en que se escriben las cadenas de promesas.
Por ejemplo:
function square (num) {
return num * num;
}
let foo = 2
let a = square(foo) //=> 4
let b = square(square(foo)) //=> 16
De acuerdo, pero lo que me gustaría hacer (a menudo para facilitar el análisis del código) es encadenar esos métodos pasando eso como el primer parámetro de una cadena. Para que algo así funcione:
let c = square(foo)
.square()
.square() //=> 256
¿Hay alguna manera de hacer esto con vainilla javascript, o es esto algo que tendría que modificar el Function.prototype para hacer?
No tendría que modificar Function.prototype, pero Number.prototype. Está intentando crear un nuevo método que actúa sobre un número, no sobre una función. Esto hace lo que estás tratando de hacer:
Number.prototype.square = function() {
return this * this;
}
let x = 4;
let y = x.square().square(); // -> 256
Puede establecer square
y num
como una propiedad de square
call`
function square (num) {
if (!this.square) {
this.square = square;
this.num = num || 0;
};
if (num === undefined) {
this.num *= this.num
}
else if (!isNaN(num)) {
this.num *= num;
};
return this;
}
let foo = 2;
let c = new square(foo).square().square();
console.log(c.num);
Realmente es una mala idea modificar Function.prototype
o Number.prototype
porque contaminarás los objetos de JavaScript predeterminados, por ejemplo: ¿y si otro framework también hace el mal y agrega su propio square
?
La forma recomendada es hacer un objeto solo.
function num(v) {
this.v = v;
this.val = function() { return this.v; };
this.square = function() { this.v = this.v * this.v; return this; };
//and you can add more methods here
this.sqrt = function() { this.v = Math.sqrt(this.v); return this; };
return this;
}
var n = new num(2)
console.log(n.square().square().sqrt().val());
Puede que le interese el funtor de identidad: le permite levantar cualquier función para operar con el valor de la identidad, por ejemplo, square
y mult
continuación. Obtienes una interfaz encadenable sin tener que tocar prototipos nativos ^ _ ^
const Identity = x => ({
runIdentity: x,
map: f => Identity(f(x))
})
const square = x => x * x
const mult = x => y => x * y
let result = Identity(2)
.map(square)
.map(square)
.map(square)
.map(mult(1000))
.runIdentity
console.log(result)
// 256000