在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()
,但无法使其正常工作。
答案 0 :(得分:1)
因此,我不确定我是否完全理解该问题的“原因”,但我将对此进行介绍。
您可以做的是创建一个数据类型,并使其返回默认值,然后当您使用“新”构造函数时,便可以像函数一样访问其值。
因此,如果您在下图中看到我创建了一个函数,并具有在构造数据类型时可以使用的值,但是,如果我只是调用该函数,则可以返回一个值。
如果您使用该函数的构造函数并创建此数据类型的实例,则可以直接操作该值。
我不认为这完全可以使您到达想要的地方,但是我希望它可以使您更近一些。
function Payload(val, options) {
this.innerFunction = () => { console.log(options)}
this.value = val
return val
}
console.log(Payload(10, {key:"KEY" })) // print 10
console.log(typeof Payload(10, {key:"KEY" })) // number
x = new Payload(10, {key:"KEY" })
x.innerFunction() // returns {key:"KEY" }
x.val // returns 10