Например, как функция.

отаю над библиотекой синтаксического анализатора в JavaScript. Для этого я хочу создать функции, которые можно вызывать, как и любые другие функции, но также иметь функции-члены, которые можно вызывать по очереди для получения вывода на основе функции, к которой они присоединены (например, комбинаторы).

Конечно, я могу добавить членов к таким функциям:

//the functions I want to add additional members to
function hello(x) {
    return "Hello " + x;
}

function goodbye(x) {
    return "Goodbye " + x;
}

//The function I want as a member of the above functions.
//it creates another function based on the function it is 
//attached to.
function double() { 
    var that = this;
    return function(x) {
        return that(x) + ", " + that(x);
    };
}

//I can attach them manually to the function objects:
hello.double = double;
//calling hello.double()('Joe') results in => "Hello Joe, Hello Joe"
goodbye.double = double;
//calling goodbye.double()('Joe') results in => "Goodbye Joe, Goodbye Joe"

Я мог бы создать функцию, которая расширяет все мои функции сdouble член, но я должен помнить, чтобы называть его каждый раз, когда я создаюHey, Sayonaraи т. д. функция. Также мои функции приветствия будут иметь все эти члены каждый, непосредственно в объекте функции, для каждого экземпляра. Я бы предпочел поместить их всех в один прототип и сделать его прототипом всех моих функций приветствия. Следующие опции тоже не работают:

заменаhello.__proto__ (нестандартный, не работает во всех браузерах)модифицированияFunction.prototype напрямую (добавил бы эти члены ко всем другим функциям, но они не имеют смысла там - я только хочу позвонитьdouble на множестве моих собственных функций)

Можно ли даже дать объекту функции собственный прототип или я застрял с изменением каждого созданного мной объекта функции?

ОбновитьЯ изменил приведенный выше пример, чтобы он больше походил на реальную проблему, над которой я работаю. Это про модыфингфункциональные объекты не нормальные объекты. Конечной целью является обеспечение удобного синтаксиса для комбинаторов синтаксического анализа, например, (значительно упрощено):

//parses one argument
var arg = …
//parses one function name
var name = …
//parses a function call, e.g. foo(x+y, "test", a*2)
var functionCall = name.then(elem("(")).then(arg.repSep(",")).then(")").into(process(…))

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

Ответы на вопрос(4)

Ваш ответ на вопрос