В Javascript я хотел бы создать переменную (примитив или объект), которая также может быть вызвана как функция.
Желаемый результат:
console.log(myVar) // Outputs some variable previously defined
console.log(myVar()) // Outputs the result of some previously defined function
Я бы хотелпеременная раньше была точно такой же.Например, я не хочу:
const myVar = () => 1;
myVar.prop = 2;
Я попытался переопределить обе функции Object.prototype.toString и Object.prototype.valueOf, но каждая из них должна быть вызвана вручную:
const myVar = () => 1;
myVar.toString = () => 2;
console.log(myVar + myVar) // This outputs 4, thanks to coercion
console.log(typeof myVar) // Outputs function, want 'number' in this example
Мой вариант использования для этого - следующий сценарий, где результат someFunction(payload)
действует как значение и функция.
someFunction(payload)(options) // Result depends upon payload and options, returns a value
someFunction(payload) // Options is not specified, returns a value
someFunction(payload, options) // Would prefer not to use this method
В желаемом случае использования я хотел бы someFunction(payload)
действовать как псевдоним для someFunction(payload)()
.Я попытался:
const someFunction = payload => {
const innerFunction = options => {
// Return value depending on payload and, if it exists, options
};
innerFunction.toString = () => innerFunction();
return innerFunction;
};
console.log(someFunction(payload)(options)) // A value, correct
console.log(someFunction(payload)) // A function, do not want
Я также пытался использовать комбинацию вызовов toString
и eval
(для выполнения функции с строковыми значениями), чтобы вызвать toString()
, но не смог заставить его работать.