当传递参数时,获取工厂函数的名称(奇怪)

问题描述 投票:0回答:1

好吧,我有一个问题。

简短的版本。 我想这样做

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)
}

我尝试过其他的方法,比如这样

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

在过去的一周里,我尝试了很多不同的方法来做这件事,但没有成功。谁能帮帮我?

长篇大论。 我有一个磁铁行为工厂函数和一个粒子工厂函数,看起来是这样的:

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
}

问题是我不能让行为部分工作。现在我已经有了一个磁性行为工厂,但我还想有一个eletrical,gravitacional,随机等行为。我想让粒子对象得到行为名作为一个新的属性键,当这个行为作为参数传递给粒子工厂函数时,它创建的对象作为这个属性值,类似这样。

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,但它没有任何作用,因为我仍然需要将行为函数与其参数一起传递给粒子工厂。

这有可能吗?怎么做?

javascript callback factory-pattern
1个回答
0
投票

不,这是不可能的。不,这是不可能的,除非 catdogbirdmagneteletric 都返回一个包含各自工厂名称的对象。

尤其是

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

如果你使用的是classesconstructors+prototypes, 你当然可以使用隐式的... ... .constructor.name 而非 .kind 我在上面的例子中选择的属性。

© www.soinside.com 2019 - 2024. All rights reserved.