使用map()调用数组中对象的方法

时间:2017-12-22 06:28:20

标签: javascript arrays

我试图使用map找出单线代码。

这是一个简单的设置。

function Cat(name) {
    this.name = name;
    // FYI: using __proto__ is discouraged. thanks @KarelG
    this.__proto__.mew = function () {
        console.log(this.name + " mews");
    };
}

var cats = [
    new Cat('MB'),
    new Cat('503')
];

然后,我可以使用map()在猫中调用mew方法。

cats.map(function (cat) {
    cat.mew();
});
// MB mews
// 503 mews
原型上的

call()也有效。

cats.map(function (cat) {
    Cat.prototype.mew.call(cat);
});
// MB mews
// 503 mews

这是我的最后一行,但它会发出错误,我无法理解原因:

cats.map(Cat.prototype.mew.call);

// Uncaught TypeError: undefined is not a function
// at Array.map (<anonymous>)

检查typeof Cat.prototype.mew.call说它是function 并且map()的参数应该是一个函数。

有人能解释为什么它不起作用吗? 我错过了什么以及在哪里纠正?

1 个答案:

答案 0 :(得分:6)

  

有人可以解释为什么它不起作用?我错过了什么,在哪里   正确的吗?

错误消息说

  

VM1100:15 Uncaught TypeError:undefined不是函数

这意味着它希望mew的上下文中调用undefined方法

您需要将上下文绑定为

cats.map( Cat.prototype.mew.call.bind( new Cat().mew ) );

<强>演示

function Cat(name) {
    this.name = name;
    this.__proto__.mew = function () {
        console.log(this.name + " mews");
    };
}

var cats = [
    new Cat('MB'),
    new Cat('503')
];
cats.map( Cat.prototype.mew.call.bind( new Cat().mew ) );

或者@PatrickRoberts建议,您可以使用

cats.map(Function.call.bind(Cat.prototype.mew))

避免不必要地创建Cat

的实例
  

cats.map(function (cat) { Cat.prototype.mew.call(cat); });   表达式,为什么Cat.prototype.mew.call具有正确的上下文?

根据spec

  

如果提供了thisArg参数,它将用作此值   每次调用callbackfn。如果未提供,则未定义   反而用了。

所以,除非你传递像

这样的上下文
cats.map( Cat.prototype.mew.call,  new Cat().mew );

它将是undefined