使用JavaScript的地图和对象的方法

时间:2014-07-13 22:43:20

标签: javascript

如果我有一个表示数字的字符串数组,并希望将数组中每个条目的类型转换为数字,我可以使用map

var stringNumbers = ["11", "23", "5813"];
stringNumbers.map(parseFloat);
// [11, 23, 5813]

这是有效的,因为parseFloat可以全局访问。但是,如果我想要对象方法的结果,我似乎需要使用匿名函数。

var Dog = function(name) {
  this.name = name;
};

Dog.prototype.getName = function() {
  return this.name;
};

var dogs = [new Dog("Beatrice"), new Dog("Baxter")];

dogs.map(function(dog) {
  return dog.getName();
});
// ["Beatrice", "Baxter"]

理想情况下,我可以做类似的事情:

dogs.map(getName); // ["Beatrice", "Baxter"]

但这不起作用,因为getName不可全局访问。

有没有办法将map执行的每个函数绑定到它迭代的对象的上下文?

2 个答案:

答案 0 :(得分:4)

技术上 IS 可以作为

var r = dogs.map(Function.prototype.call.bind(Dog.prototype.getName));

JSFiddle:http://jsfiddle.net/VCvp7/

说明:

Function.prototype.call.bind(Dog.prototype.getName)

返回一个等于Dog.prototype.getName.call的函数引用,它期望第一个参数作为上下文(在调用this期间使用的getName值),这就是{ {1}}将确切的map()实例传递给。

PS :对不起,无法解释得更好。如果你没有得到它 - 只需花费几分钟就可以搞清楚。

答案 1 :(得分:1)

如果我的项目中有下划线库,我会使用invoke:

// Use _.invoke to call method getName() on each dog in dogs
var dogNamesInvoke = _.invoke(dogs, 'getName');
// ["Beatrice", "Baxter"]

但是也意识到你可以传递第二个参数来映射thisArg。

// Use Array.map but pass the function name 'getName' as the 2nd parameter to map
var dogNamesMap = dogs.map(function(value) {
    var functionName = this;
    return value[functionName].apply(value);
}, 'getName');
// ["Beatrice", "Baxter"]

以下是link to a Plunker,其中显示了您的原始代码以及其他两个选项。