我有几个相同类型的对象,并希望从每个对象运行相同的函数:
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()?
答案 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)
你可以创建一个数组,然后遍历数组,调用函数