2011-01-17 8 views
1

In JavaScript-System der prototypischen Vererbung wird die interne Prototypreferenz eines Objekts auf die "Prototyp" -Eigenschaft des Konstruktors gesetzt, die selbst ein Objekt ist.Im * Constructor deklarierte Eigenschaften sind in Instanzen sichtbar. Warum?

Eigenschaften der "Prototyp" -Eigenschaft des Konstruktors können aufgelöst werden, als wären sie Eigenschaften von Objektinstanzen. Allerdings sind die tatsächlichen Eigenschaften des Konstrukteurs Objekts nicht zugänglich zu der Instanz:

function MyConstructor() { } 
MyConstructor.x = 3 
MyConstructor.prototype.y = 7 

a = new MyConstructor() 
a.x == 3 // FALSE 
a.y == 7 // TRUE 

Wenn jedoch die Eigenschaft („x“) des Konstrukteurs in dem Funktionskörper mit dem this Schlüsselwort deklariert wird, diese Eigenschaften werden natürlich von Fällen behoben werden:

function MyConstructor() { 
    this.x = 3 
} 
MyConstructor.prototype.y = 7 

a = new MyConstructor() 
a.x == 3 // TRUE 

Warum? Was ist der Unterschied?

Antwort

6

Wenn Sie dies tun:

MyConstructor.x = 3; 

... Sie hinzugefügt haben nur eine Eigenschaft auf die Funktion Objektinstanz durch MyConstructor verwiesen. Ein Function-Objekt hat viele Eigenschaften, die nicht Teil der Instanz werden (und auch nicht wollen).

Daher ist der Mechanismus zum Erstellen von Instanzeigenschaften über den Konstruktor die Methode this.x.

Wenn der Konstruktor ausgeführt wird, ist this das Objekt, das zurückgegeben wird. So ist es nur eine Bequemlichkeit, damit Sie nicht zu tun haben:

a = new MyConstructor(); 
a.x = 3; 
a.x == 3 // TRUE! 

Da this im Konstruktor das gleiche wie das resultierende Objekt ist, gibt es keine Notwendigkeit, sie explizit bei jeder neuen Instanz Schöpfung zu tun.

Das prototype Objekt ist einfach ein Objekt, das von allen Instanzen MyConstructor so referenziert wird, wenn es nicht eine Eigenschaft auf der Instanz ist, geht es dann auf die prototype zu finden.


Um die Beziehung zwischen this und der neuen Instanz veranschaulichen, betrachten Sie dieses Beispiel:

Beispiel:http://jsfiddle.net/M2prR/

var test; // will hold a reference to "this" 

function MyConstructor() { 
    test = this; // make "test" reference "this" 
} 

    // create a new instance 
var inst = new MyConstructor; 

    // see if they are the same object. This will alert "true" 
alert(inst === test); 
+0

Vielen Dank, das ist v klar. 'this' bezieht sich auf die erstellte Instanz, nicht auf den Konstruktor. Im Nachhinein offensichtlich! –

+0

Um zu verifizieren: 'a.hasOwnProperty ('x') // => TRUE' (Bestätigt, dass' x' eine Eigenschaft von 'a' ist und nicht durch Folgen der Prototypkette abgerufen wird.) –

+0

@Benji XVI: You 'Du bist willkommen. Ich habe ein Beispiel hinzugefügt, das es weiter veranschaulicht. – user113716

Verwandte Themen