Ich habe das:

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

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

Jetzt habe ich ein Array von Coords-Objekten. Ich möchte jede Coords-Instanz mit der toArray-Methode in ein Array konvertieren. Ich könnte eine Schleife schreiben, aber ich würde lieber $ .map verwenden, da diese kürzer und besser lesbar ist. Leider ist dies:

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

Funktioniert überhaupt nicht. Es stoppt nur die Ausführung. Das Problem könnte darin bestehen, wie unabhängig von einem Objekt auf eine Methode verwiesen wird. Gibt es eine Möglichkeit, auf eine Methode zu verweisen, ohne zuvor eine Instanz zu erstellen? Oder um $ .map mit einer Methode zu verwenden?

Vielen Dank für Ihre Erkenntnisse.

EDIT: Nun, tatsächlich stoppt es die Ausführung nicht (dies kam von einem anderen Problem), aber $.map(coords_array, Coords.prototype.toArray); gibt [null, null, null, null, null ...] zurück. Ich finde dieses Verhalten seltsam.

3
John Smith Optional 8 Okt. 2012 im 02:50

3 Antworten

Beste Antwort

Versuchen Sie etwas wie:

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

Weitere Informationen zur Kartenfunktion von jQuery finden Sie unter hier.

1
Jordan Denison 7 Okt. 2012 im 23:12

Der Grund dass:

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

Funktioniert nicht wie erwartet, wenn Sie einen Verweis auf die Funktion an map übergeben. Wenn sie aufgerufen wird, wird das Schlüsselwort this nicht auf die Instanz festgelegt und standardmäßig auf das globale Objekt (oder) gesetzt undefiniert im ES5-Strict-Modus). Sie sollten in der Lage sein:

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

So dass die this der Funktion auf die Instanz gesetzt wird.

Bearbeiten

Siehe Jordans Antwort.

0
RobG 7 Okt. 2012 im 23:25

Anscheinend setzt $.map den Kontext (dies) nicht auf das aktuell verarbeitete Element (wie z. B. $.each).

Sie können entweder mit einem Wrapper gehen:

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

Oder erweitern Sie die Methode toArray(), um auch mit dem ersten Argument zu arbeiten:

Coords.prototype.toArray = function() {
    var self = this instanceof Coords ? this : arguments[0];
    return [self.x, self.y];
}
1
Niko 7 Okt. 2012 im 23:04