Например, как функция.
отаю над библиотекой синтаксического анализатора в 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(…))
Я хочу иметь возможность добавлять участников в наборфункции поэтому, когда эти члены вызываются, они возвращают новые функции в зависимости от функции, для которой они были вызваны. Это должно использоваться для комбинаторов парсеров / монадических парсеров.