Javascript:如何创建一个既像对象又像函数的变量?

标签 javascript ecmascript-6

在 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

我还尝试使用调用toStringeval(执行字符串化函数)的组合来触发toString(),但是无法让它工作。

最佳答案

所以我不完全确定我理解这个问题的“为什么”,但我会尝试一下。

您可以做的是创建一个数据类型并让它返回一个默认值,然后当您使用"new"构造函数时,您可以像函数一样访问它的值。

因此,如果您在下图中看到我创建了一个函数,并且具有在构造数据类型时可以使用的值,但是如果我只是调用该函数,我可以返回一个值。

如果您使用该函数的构造函数并创建此数据类型的实例,则可以直接操作该值。

我认为这并不能完全让你到达你想要的地方,但我希望它能让你更接近一点。

   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

关于Javascript:如何创建一个既像对象又像函数的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56267107/

相关文章:

javascript - 使用Javascript计算并输入html

javascript - 旨在返回数组的函数返回未定义。函数内的 Console.log(array) 返回数组

javascript - Java 返回 cannont invoke ScriptEngine 错误

javascript - "...this.props"在 ReactJS 中是什么意思?

javascript - 返回数组中偶数的总和

javascript - 避免黑客正确绑定(bind)到 ES6 中的类?

meteor - 如何在 Meteor 中使用 ES2015 代理?

javascript - webpack 错误意外 token

javascript - 按类别对 JSON 内容进行排序

javascript - 如何使 JavaScript indexOf() 不检测子字符串