我有这个:
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 ...]。
我发现这种行为很奇怪。
答案 0 :(得分:1)
答案 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
设置为实例。
见乔丹的答案。