2015-05-07 7 views
5

Ich versuche, den JavaScript-Prototyp zu verstehen, und ich bin etwas verwirrt.Es gibt Tonnen von Tutorials draußen und jeder hat unterschiedliche Erklärung darauf. Ich weiß also nicht, wo ich anfangen soll.Warum Prototyp ist nicht in einfachen JavaScript-Objekt verfügbar

Bisher hat ich ein einfaches JavaScript-Objekt

var a = {flag : 1} 

In MDN erstellt habe, habe ich gelesen, dass

Alle Objekte in JavaScript von Object abstammen

Aber ich couldn‘ t finde den Prototyp für dieses Objekt eina.prototype gibt mir undefined

Dann fand ich den Prototyp ist in a.constructor.prototype verfügbar. Beim Erstellen einer Funktion steht var myfunc = function() {} und dann myfunc.prototype zur Verfügung. Die Prototypeigenschaft ist also direkt auf Funktionen und nicht auf Objekten verfügbar.

Bitte helfen Sie mir das zu verstehen und was ist das a.constructor.

Jede Hilfe wird sehr geschätzt.

+0

Diese genaue Frage wurde vor etwa einer Woche gestellt und beantwortet. Ich werde versuchen, das Duplikat zu finden. – jfriend00

+0

var a = {}; ist die Abkürzung für neues Objekt(). Was Sie wissen, ist die Wurzel aller Objekte – Haagenti

+0

Eine weitere doppelte Erklärung: [Erweitern Prototyp auf Objektliteral] (http://stackoverflow.com/questions/29977892/extending-prototype-on-object-literal/29977926#29977926) – jfriend00

Antwort

1

Jede Funktion als Konstruktor (mit new Schlüsselwort) aufgerufen werden.

function Dog() { 
    this.legs = 4; 
} 

Wenn Sie es als eine normale Funktion aufrufen, var dog = Dog(), wird es window.legs in Browsern definieren 4 (etwas ein bisschen anders, aber wenn in Node.JS bezogen) sein, und setzen dog-undefined.

jedoch, wenn Sie es als Konstruktor aufrufen, wie var dog = new Dog(), wird es ein neues Objekt machen, und legen Sie seine constructor auf diese Funktion, und ordnen Sie dieses neue Objekt dog. Es wird seinen internen Prototyp (der in einige Browser als dog.__proto__ zugegriffen werden kann) auf den Prototyp des Konstruktors setzen (Dog.prototype). Oder in Pseudo-Code,

var dog = { 
    legs: 4 
}; 
dog.constructor = Dog; 
dog.__proto__ = Dog.prototype; // same as dog.constructor.prototype 

So dog.constructor.prototype ist streng genommen nicht, den Prototyp dog, ist es die Aufgabe, die dem Prototyp zugeordnet wird erhalten, wenn der Konstruktor-Funktion ausgeführt wird. Und insbesondere Dog.prototype ist nicht Prototyp der Dog Funktion (nur der Prototyp, den seine Instanzen erwerben). Der Grund prototype ist nicht auf Nicht-Funktionen verfügbar ist, weil Nicht-Funktionen nicht als Konstruktoren verwendet werden können, so macht es keinen Sinn, es zu haben (da seine einzige Funktion ist, in konstruierte Instanzobjekte '__proto__ kopiert werden).

Das Objekt in Ihrem Beispiel hat noch einen Prototyp, aber nicht direkt zugänglich; Sie können entweder die Hacky Route in den Browsern gehen, die es erlauben (a.__proto__), oder fragen Sie den Browser schön (Object.getPrototypeOf(a)).

+0

Danke für diese großartige Antwort. Sie haben in Pseudocode Hund erwähnt .__ proto__ = Dog.constructor.prototype; Aber Hund .__ Proto__ == Dog.constructor.prototype zeigt 'falsch' Könnten Sie bitte erklären.? – Wishnu

+0

Typo, Entschuldigung. Sollte 'dog.constructor.prototype' sein (was dasselbe wie' Dog.prototype' ist). Bearbeitet. – Amadan

+0

Könntest du bitte diese Zeile erklären "Und insbesondere ist Dog.prototype kein Prototyp der Dog-Funktion (nur der Prototyp, den seine Instanzen erhalten)" – Wishnu

2

Sie können stattdessen Object.getPrototypeOf() verwenden, um den Prototyp von Object zurückzugeben.

Um dies zu sehen in Ihrem Browser devtools, führen Sie die folgenden Schritte aus: kann

var a = {flag: 1}; 
console.dir(Object.getPrototypeOf(a)); 
+0

Danke für die Antwort – Wishnu

Verwandte Themen