3

私はこれを持っています:

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...]を返します。この振る舞いは奇妙だと思います。

4

3 に答える 3

1

次のようなものを試してください:

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

また、jQueryのマップ関数の詳細については、ここを参照してください。

于 2012-10-07T22:52:51.400 に答える
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];
}
于 2012-10-07T23:04:05.270 に答える
0

その理由:

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

関数への参照をに渡すと期待どおりに機能しmapないため、呼び出されたときに、そのthisキーワードはインスタンスに設定されず、デフォルトでグローバルオブジェクト(またはES5ストリクトモードでは未定義)になります。次のことができるはずです。

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

関数thisがインスタンスに設定されるようにします。

編集

ジョーダンの答えを参照してください。

于 2012-10-07T23:25:25.093 に答える