Javascript: Как создать переменную, которая действует как объект и функция? - PullRequest
0 голосов
/ 23 мая 2019

В 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(), но не смог заставить его работать.

1 Ответ

1 голос
/ 23 мая 2019

Так что я не совсем уверен, что понимаю «почему» этого вопроса, но я собираюсь дать этому шанс.

Что вы можете сделать, это создать тип данных и вернуть ему значение по умолчанию, а затем, когда вы используете «новый» конструктор, вы можете получить доступ к его значениям, таким как функция.

Так что, если вы видите на рисунке ниже, я создал функцию и у меня есть значения, которые можно использовать, если я сконструировал тип данных, однако, если я просто вызываю функцию, я могу вместо этого вернуть значение.

Если вы используете конструктор функции и создаете экземпляр этого типа данных, вы можете просто манипулировать значением напрямую.

Я не думаю, что это полностью приведет вас туда, куда вы хотите, но я надеюсь, что это немного приблизит вас.

   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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...