【发布时间】:2014-01-22 16:05:41
【问题描述】:
想象一下我有这种类型:
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/map/ 上使用 call/apply还有什么?
如果您有兴趣,这里是上述onEach 方法的简单实现:
Array.prototype.onEach= function(func) {
var args = Array.prototype.slice.call(arguments, 1);
this.forEach(function(item) {
item[func].apply(item, args);
});
};
【问题讨论】:
-
@SLaks 这只是
Array.prototype.forEach的一个 shim - OP 想要在每个对象上调用特定 named 函数的东西,而不是单个提供的函数引用。 -
@Alnitak 完全正确!它没有按照我的要求做,我已经展示了如何使用 forEach 来实现它
-
@WickyNilliams FWIW,我想不出比你已经写的更简单的了,这有点整洁。但是为了安全起见,您应该在可用的情况下使用
Object.defineProperty(Array.prototype, 'onEach', ...),这样新方法就不会显示为每个Array对象的可枚举属性。 -
您拥有的代码就是您想要的代码。您可能希望首先确保该函数是否存在,但除此之外,您已经有了答案。
标签: javascript arrays function foreach