Übergeben Sie einen Konstruktor an Array.map?

9

Wie kann ich so etwas tun:

%Vor%

Dieser Code löst einen Fehler bei Google V8 aus:

%Vor%

Ich habe es auch versucht:

%Vor%

mit dem gleichen Ergebnis.

    
set 28.06.2011, 07:24
quelle

4 Antworten

0

Das Date ist eine Funktion, daher ist der Date.constructor ein Konstruktor einer Funktion. Der richtige Aufruf des Date-Objektkonstruktors sieht folgendermaßen aus:

%Vor%

Oder nur:

%Vor%

Das Problem besteht darin, ein Array von Date-Objekten mit Zeitwerten aus dem Array a zu erstellen. aber es ist unmöglich, den Date-Objektkonstruktor aufzurufen und ihm Argumente ohne einen new -Operator (ECMA-262 15.9.2) zu übergeben.

Aber es ist möglich für alle Objektkonstruktoren, die als Funktionen mit demselben Ergebnis aufgerufen werden können, als ob ich den new -Operator verwende (zum Beispiel den Error-Objektkonstruktor (ECMA-262 15.11.1)).

%Vor%     
set 28.06.2011, 19:15
quelle
4

Versuchen Sie das zu tun?

%Vor%     
Jordan Running 28.06.2011 07:41
quelle
0

Die map-Methode iteriert nur ein Array mithilfe der bereitgestellten Callback-Funktion (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/map). Also:

%Vor%

Was willst du daraus machen?

%Vor%

Aktualisierung vom Kommentar:

  

Das Problem besteht darin, ein Array zu erstellen   von Date-Objekten mit Zeitwerten von   Array a durch Übergabe des Date-Objekts   Konstruktor zu einer Kartenfunktion. Sowieso   Es ist ein Fehler im Code (siehe   Kommentar zu pst) - set

Ich sehe, so etwas wie:

%Vor%     
johnmdonahue 28.06.2011 07:38
quelle
0

Ich denke, was der OP suchte, ist genau analog dazu:

%Vor%

Ich nehme an, der Grund dafür ist, dass dies sehr elegant ist, sowohl in einfachen Typ-Casting-Operationen wie oben, als auch in interessanteren Aufgaben wie der Umwandlung einer Repräsentation von etwas in eine andere Repräsentation:

%Vor%

Das Problem damit scheint zu sein, dass das neue Objekt, wenn es durch Übergabe des Konstruktors an Array.map erstellt wird, eine erweiterte Version von window ist; Das heißt, this im Konstruktor bezieht sich auf den globalen Bereich, der saugt, weil (1) es nicht dein Ziel war, Requisiten auf window zu hängen, und (2) die auf diese Weise erstellten Objekte keine eindeutigen Instanzen sind.

Für das, was es wert ist, ist das ursprüngliche Casting-Beispiel nicht alles, was es ist, weil:

%Vor%

Die einzige Lösung, die mir bisher einfällt, ist, den Konstruktor anders zu schreiben - was Sie natürlich für native Typen wie Date nicht tun können:

%Vor%

Indem wir den Rückgabewert als neues Objekt definieren, trennen wir die Verbindung zwischen dem globalen Bereich und this ; zumindest geht das hier davon aus. (Sie könnten auch ein JSON-Literal zurückgeben, anstatt Object aufzurufen.)

Wenn ich möchte, dass diese Objekte einen interessanten Prototyp haben, muss ich sie separat definieren und dann explizit anhängen:

%Vor%

In diesem Fall ist es nicht so gut, JSON zurückzugeben, weil es scheinbar keine effektiven Möglichkeiten gibt, den Prototyp eines Objektliterals zu setzen; und selbst wenn du könntest, willst du niemals das , um wahr zu sein:

%Vor%

Ich denke, der beste Weg, um sicherzustellen, dass das neue Objekt den gewünschten Prototyp hat, ist die Übergabe des Prototyps als Argument an new Object() .

Ist dieses Muster ideal? Ich weiß es nicht. Es scheint etwas komisch, da es jetzt zwei Symbole gibt, die mit der Erstellung von Menschen verknüpft sind: Human die Konstruktorfunktion und HumanProto der explizite Prototyp. Noch wichtiger ist, dass dies wie eine echte Barriere erscheint, wenn Sie bereits ein Ökosystem mit lustigen benutzerdefinierten Klassen haben, die nicht mit diesem Muster kompatibel sind.

Es gibt wahrscheinlich einen besseren Weg da draußen. Vielleicht wird jemand es veröffentlichen.

    
Tom 12.05.2015 01:40
quelle