Javascript从多个对象运行相同的功能

时间:2017-12-17 01:09:10

标签: javascript

我有几个相同类型的对象,并希望从每个对象运行相同的函数:

function animal(name){
    this.name = name
    function foo(){
        console.log(this.name);
    }
}

var dog = new animal("dog");
var cat = new animal("cat");
var bird = new animal("bird");

通常,我会这样做:

dog.foo();
cat.foo();
bird.foo();

但是,如果我有一百个这样的话,这不是一个非常有效的方法。有没有办法只用几行就能从每只动物身上运行foo()?

4 个答案:

答案 0 :(得分:4)

嗯,要有效地做到这一点,你必须有效地组织你的对象。订购多个对象的最有效方法通常是数组。因此,您创建一个包含所有动物的数组,并在每个动物上调用foo。数组将让你完全这样做,在代码中只调用一次函数,但它会在所有对象上发生。

在这里你必须考虑是否在任何时候可能有一个没有foo()函数的动物。如果没有,请保持原样,如果是,那么你可以调用不同的功能,或者根据具体情况忽略该特定的动物:

创建对象:

let animalArray = []
animalArray.push(new Animal("cat"))
animalArray.push(new Animal("dog"))
animalArray.push(new Animal("bird"))
animalArray.push(new Animal("hippo"))

在每个对象上调用foo():

animalArray.forEach(animal => animal.foo())

ES5:

animalArray.forEach(function(animal){
   animal.foo() 
})

如果动物可能没有foo():

animals.forEach(animal => {
   if(animal.foo){
       animal.foo()
   }else{
       //call other function or ignore and do nothing
       animal.bar()
   }
})

答案 1 :(得分:0)

首先,约定是大写你的构造函数

function Animal(name){
    this.name = name
    function foo(){
        console.log(this.name);
    }
}

我特意这样做是为了能够在animal内使用reduce作为变量而不会发生碰撞(也许我可以使用name,但我想到了关于命名约定的上述观点对于构造函数是值得的)。

然后,为了使其尽可能高效,因为你提高了效率,你可能意味着代码行,所有你的动物名字都预先放在一个阵列中。然后使用Animal创建一个对象,其中包含所有动物名称作为键,值为reduce个实例。最后,我们可以通过调用Animal上的forEach来按插入顺序遍历animalNames个实例; for animal in animalObjects循环保证按插入顺序返回对象。

var animalNames = ['dog','cat','bird'];
var animalObjects = animalNames.reduce(function(result, animal), {
    result[animal] = new Animal(animal);
}, {});
animalNames.forEach(function(animal) {animalObjects[animal].foo()});

比较中接受的答案不会缩放,因为您添加动物需要添加额外的推送调用。使用上面的示例,您只需要在animalNames数组文字中添加条目:

var animalNames = ['dog','cat','bird','squirrel','skunk','opposum']; //etc.

上述的另一个好处是这些animalNames可能来自JSON

答案 2 :(得分:0)

首先,如果你想要" foo"要成为一个classMethod你需要将它绑定到这个,或更清楚的方式,使用类定义。这是一种更具功能性的方法:

class Animal {
  constructor(name) {
    this.name = name;
  }
  woof(){
    console.log(this.name, 'is woofing!');
  }
}

var animalNames = ['dog', 'cat', 'bird'];

var animals = animalNames.map((name) => new Animal(name));

animals.map((animal) => animal.woof());

答案 3 :(得分:-3)

你可以创建一个数组,然后遍历数组,调用函数

相关问题