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)).
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%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:
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.
Tags und Links javascript arrays constructor map prototype-programming