[英]Javascript: How to create a variable that acts like both an object and a function?
在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()
,但無法使其正常工作。
所以我不能完全確定我理解這個問題的“原因”,但是我將對此進行一下介紹。
您可以做的是創建一個數據類型,並使其返回默認值,然后在使用“新”構造函數時,您可以像使用函數一樣訪問其值。
因此,如果您在下圖中看到我創建了一個函數,並具有在構造數據類型時可以使用的值,但是,如果我只是調用該函數,則可以返回一個值。
如果使用函數的構造函數並創建此數據類型的實例,則可以直接操作該值。
我認為這不會完全將您帶到您想要的地方,但是我希望它可以使您更近一些。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.