引用不首先创建实例的方法/使用jQuery或任何javascript map函数映射方法

时间:2012-10-07 22:50:05

标签: javascript jquery methods map prototype

我有这个:

var Coords = function(x, y){
        this.x = x;
        this.y = y;
    }

Coords.prototype.toArray = function(){
    return [this.x, this.y];
}

现在我有一个Coords对象数组。我想使用toArray方法将每个Coords实例转换为数组。 我可以写一个循环,但我宁愿使用$ .map,因为它更短,更易读。 不幸的是,这个:

return $.map(coords_array, Coords.prototype.toArray);

根本不起作用。它只是停止执行。 问题可能在于如何独立于任何对象引用方法。 没有先创建实例的任何指向方法的方法? 或者使用带有方法的$ .map?

感谢您的见解。

编辑:嗯,事实上,它并没有停止执行(这来自另一个问题),但$.map(coords_array, Coords.prototype.toArray);返回[null,null,null,null,null ...]。 我发现这种行为很奇怪。

3 个答案:

答案 0 :(得分:1)

尝试类似:

return $.map(coords_array, function(val, i) { val.toArray(); });

并参考here以获取有关jQuery地图功能的更多参考。

答案 1 :(得分:1)

显然,$.map没有将上下文(this)设置为当前正在处理的元素(例如$.each)。

你可以使用包装器:

$.map(coords_array, function(coord) { return coord.toArray(); });

或扩展toArray()方法以使用第一个参数:

Coords.prototype.toArray = function() {
    var self = this instanceof Coords ? this : arguments[0];
    return [self.x, self.y];
}

答案 2 :(得分:0)

原因:

> $.map(coords_array, Coords.prototype.toArray);

无法按预期工作,因为您将对函数的引用传递给map,因此在调用它时,其this关键字未设置为实例并默认为全局obejct(或在ES5严格模式下未定义)。你应该能够做到:

$.map(coords_array, function(item, index) {
    Coords.prototype.toArray.call(item);
});

以便将函数this设置为实例。

修改

见乔丹的答案。