想象一下我有这种类型:
function Greeter(greeting) {
this.greeting = greeting;
}
Greeter.prototype.say = function(audience) {
audience = audience || "world";
console.log(this.gretting, audience);
};
这样的数组:
var greeters = [new Greeter("hello"), new Greeter("bonjour")];
有没有办法做这样的事情:
greeters.onEach("say", "people");
// outputs:
// hello people
// bonjour people
当然这种方法是虚构的,但感觉应该有一些聪明的方法来做这件事而不在Array
原型上定义一个新方法,也许是通过在forEach
上使用call / apply / map
/其他什么?
如果您有兴趣,请参阅以上onEach
方法的简单实现:
Array.prototype.onEach= function(func) {
var args = Array.prototype.slice.call(arguments, 1);
this.forEach(function(item) {
item[func].apply(item, args);
});
};
答案 0 :(得分:0)
greeters.forEach(function(greeter){
greeter.say('people');
});
答案 1 :(得分:0)
经过一番思考后,我认为实现这一目标的最佳方法是使用辅助函数。这样可以节省对Array原型的污染,并且仍然可以解决这个问题。它与我上面的onEach
方法非常相似,但使用闭包来创建一个可以用作迭代器的函数。
function func(name) {
var args = Array.prototype.slice.call(arguments, 1);
return function(obj) {
return obj[name] && obj[name].apply(obj, args);
}
}
然后可以像上面这样使用我的数组:
greeters.forEach(func("say")); // call function "say" on each object
greeters.map(func("say", "people")); // ["hello people", "bonjour people"]
我怀疑这也将被视为解决问题的“更多功能”方法。在大型代码库中,这可能会节省大量的样板代码。