2016-05-03 12 views
0

Ausgehend von einem klassenbasierten OOP-Hintergrund (C++/Java/C#) bin ich auf dem Weg, objektorientiertes JavaScript zu lernen. Ich lese oft Ratschläge über die Verwendung von Object.create(...) anstelle von new ..., wenn es sich um Objekte handelt, ist JS.Erstellen eines XMLHttpRequest-Objekts mit Object.create()

Also habe ich versucht zu schaffen AJAX so nennt:

var req = Object.create(XMLHttpRequest); 
req.open(...); // TypeError: req.open is not a function 

Sollte open nicht in req ‚s Prototypkette sein?

Ich habe auch versucht die XMLHttpRequest Konstruktorfunktion auf mein Objekt anzuwenden:

var req = Object.create(XMLHttpRequest); 
XMLHttpRequest.apply(req, null); // Constructor XMLHttpRequest requires 'new' 

Gerade als ich dachte, dass ich mit JS des OO Weg aus der Misere war, zieht mich das in :) zurück

Viele Danke an diejenigen, die mir helfen werden zu verstehen, was hier vor sich geht.

+0

'XMLHttpRequest' ist eine Funktion. –

+0

"* Ich lese oft Ratschläge zur Verwendung von Object.create (...) anstelle von neuen ... *" - nein. Bitte lesen Sie es noch einmal. Sie sind nicht austauschbar. – Bergi

+0

ya, versuchen Sie, drucken Sie diese beiden werden Ihnen helfen, zu verstehen. console.log (neues XMLHttpRequest()); console.log (Object.create (XMLHttpRequest)); – Hammer

Antwort

1

XMLHttpRequest wurde entwickelt, um das Anfrageobjekt zurückzugeben, wenn es als Konstruktor aufgerufen wird: var req = new XMLHttpRequest(). Object.create(proto) erstellt ein neues Objekt mit dem Prototyp als ersten Parameter.
Die beiden Ansätze machen verschiedene Dinge: Objekterzeugung und Initialisierung (erster Fall) und erstellen einfach ein neues Objekt mit Prototyp (zweiter Fall).


Natürlich könnten Sie versuchen, die gleiche Sache auf diese Weise (nicht empfohlen) zu erreichen:

var obj = Object.create(XMLHttpRequest.prototype); 
XMLHttpRequest.call(obj); // initialize the request 

, die fast gleich ist:

var obj = new XMLHttpRequest(); 

Aber Sie erhalten eine Fehlermeldung:

Uncaught TypeError: Failed to construct 'XMLHttpRequest': Please use the 'new' operator


Also die richtige Lösung ist new XMLHttpRequest() zu verwenden.
Werfen Sie einen Blick auf die Fetch API, die in der Nähe ist, was Sie versuchen zu erreichen. Aber es hat eine begrenzte Unterstützung in Browsern.

Verwandte Themen