Nummer () vs neue Nummer ()? [Duplikat]

8

Ich versuche den Unterschied zwischen dem Schreiben von m = Number() (was bewirkt, dass typeof m als "number" bewertet) und m = new Number() zu verstehen (was dazu führt, dass typeof m als "object" ausgewertet wird).

Ich hätte erwartet, dass es in jedem Fall ein object ist. Ich habe gerade herumgespielt, und ich habe eine .helloWorld() -Methode zum Number -Prototyp hinzugefügt, und ich konnte auf m zugreifen, unabhängig davon, welche Methode ich verwendet habe, um sie zu instanziieren.

Was ist der Unterschied hier? Was mache ich anders beim Schreiben von Number() und new Number() ? Warum ist eins object , während das andere number ist?

    
Aerovistae 22.12.2013, 21:51
quelle

2 Antworten

4

Number() selbst gibt ein primitives Element zurück. Wenn Sie new Number() aufrufen, erhalten Sie eine neue Instanz eines Objekts, das Number s ( relevante ES5-Spezifikation ) darstellt ).

Wenn Sie eine Eigenschaft auf einem Primitiv aufrufen, wird die Primitive automatisch (wie in Java) an eine Instanz dieses Objekts gebunden, wodurch Sie helloWorld() entweder in object oder number aufrufen können.

Versuchen Sie dies jedoch;

%Vor%

Sie werden sehen, dass das letztere funktioniert, während das erstere nicht funktioniert; In der ersten wird das number auf eine Zahl autoboxiert, und die Methode bar wird hinzugefügt (das Objekt). Wenn Sie x.bar() aufrufen, erstellen Sie eine neue automatisch eingerahmte Zahl, auf der bar nicht vorhanden ist.

Im letzteren Fall fügen Sie der Number-Instanz eine Methode bar hinzu, die sich wie jede andere Objektinstanz verhält und daher während der gesamten Lebensdauer des Objekts bestehen bleibt.

    
Matt 22.12.2013, 21:59
quelle
3

So wird es implementiert. Diese bestimmte Konstruktorfunktion gibt, wenn sie ohne new aufgerufen wird, eine Primitivnummer zurück. Wenn sie mit new aufgerufen wird, gibt sie die Objektnummer zurück.

Sie können auf Prototypmethoden / -eigenschaften für Grundelemente zugreifen, da JavaScript diese im Hintergrund in Objekte konvertiert, die Prototypmethode aufruft und dann die Objektkopie wegwirft. So können Sie Dinge tun wie:

%Vor%

In der zweiten Zeile wird eine Objektkopie des Primitivs erstellt, die length -Eigenschaft des Objekts wird geprüft und anschließend wird die Objektkopie verworfen. myString bleibt als Zeichenfolgenprimitiv.

    
sbking 22.12.2013 21:57
quelle

Tags und Links