Получить имя фабричной функции при передаче с параметрами (странно) - PullRequest
0 голосов
/ 26 апреля 2020

Хорошо, у меня проблема.

КРАТКАЯ ВЕРСИЯ: Я хочу сделать это:

const createThing = function( behaviours(intensities) ){
    return {
       behaviour1: behaviour1(intensity1),
       behaviour2: behaviour2(intensity2)
       and so on for each behaviour(intensity) passed as an argument
    }
}

//so when doing:

const wtf = createThing( cat(loud), dog(whereistheball), bird(dee) );

// wtf should be:

{
   cat: cat(loud),
   dog: dog(whereistheball),
   bird: bird(dee)
}

Я пробовал среди прочего что-то вроде this:

const createThing = function( behaviours(intensities) ){
        return {
           for(a in arguments){
              [a.name]: a; 
           }
        }
    }

На прошлой неделе я пытался сделать это разными способами, но безуспешно. Кто-нибудь может мне помочь?

ДЛИТЕЛЬНАЯ ВЕРСИЯ: Хорошо, у меня есть фабричная функция поведения ма gnet и фабричная фабрика частиц, похоже, это

const magnet = funtion(intensity) {
   // returns a magnetic object with that intensity
}

const createParticle = function( location, static or dynamic, behaviours ){
  // returns a particle object with the properties and behaviours listed above
}

Проблема в том, что я не могу заставить часть поведения работать. К настоящему времени у меня есть фабрика поведения magneti c, но я также хочу иметь электрический, гравитационный, случайный и т. Д. c. Я хочу, чтобы объект частицы получил имя поведения в качестве нового ключа свойства, а объект, который он создает как значение этого свойства, когда это поведение передается в качестве аргумента функции фабрики частиц, примерно так:

const particle1 = createParticle ( location, dynamic, magnet(intensity) )

//should return
{
   location,
   dynamic,
   magnet: magnet(intensity)
}

или даже

const particle2 = createParticle ( location, dynamic, magnet(intensity), eletric(intensity) )

//should return
{
   location,
   dynamic,
   magnet: magnet(intensity),
   eletric: eletric(intensity)
}

и т. д.

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

Возможно ли это даже ??? Как???

1 Ответ

0 голосов
/ 26 апреля 2020

Нет, это невозможно. Только если cat / dog / bird / magnet / eletric все возвращают объект, который содержит название соответствующей фабрики.

В частности:

function createParticle(...args) {
    const particle = { kind: 'particle' };
    for (const element of args)
        particle[element.kind] = element;
    return particle;
}

Если вы используете классы / конструкторы + прототипы, вы, конечно, можете использовать неявное .constructor.name вместо свойства .kind, которое я выбрал в приведенном выше примере.

...