使用Array.forEach来调用"实例"方法

时间:2017-03-15 06:14:39

标签: javascript

如果我有一组对象,如:

function Fruit() {
    this.onTree = true;
}
Fruit.prototype.pick = function() {
    this.onTree = false;
};

var arr = [new Fruit(), new Fruit()];

有没有办法使用Array.forEach在每个方法上调用pick方法而不创建额外的匿名函数?

arr.forEach(function(f) { f.pick(); });

我想也许我可以使用Fruit.prototype.pick.call执行某些操作,但this函数的call上下文已丢失,所以我必须bind这样,我最终会:

arr.forEach(Function.call.bind(Fruit.prototype.pick));

哪个有效,但它非常丑陋。基本上我只想从Java那里得到这样的东西:

arr.forEach(Fruit::pick);

3 个答案:

答案 0 :(得分:5)

您可以使用多种方法,但至少需要将函数传递给forEach,因为这是它的语法。但是如果您使用ES6,则可以使用arrow functions,它可以更漂亮。

arr.forEach(f => f.pick());

答案 1 :(得分:1)

你在水果定义之后错过了(),不是吗?

    function Fruit() {
        this.onTree = true;
    }
    Fruit.prototype.pick = function() {
        this.onTree = false;
    };

    var arr = [new Fruit(), new Fruit()];

    arr.forEach(function(val, index) {
        val.pick();
        console.log(val);
    })

我测试了那个,它改变了那些fruit.onTree变成了假。

答案 2 :(得分:0)

如果你不能使用ES6(但是,好吧,2017年......)你可以存储你的this参考

 var self = this;

function invoker(item){
    Item.pick.call(self);
}

 array.forEach(invoker)

或者只使用for循环