2015-06-23 13 views
6

-Code von MDN bekommen:JavaScript Erbe mit .call (dieser)

function Employee() { 
    this.name = ""; 
    this.dept = "general"; 
} 

function Manager() { 
    Employee.call(this); 
    this.reports = []; 
} 

Manager.prototype = Object.create(Employee.prototype); 

function WorkerBee() { 
    Employee.call(this); 
    this.projects = []; 
} 

WorkerBee.prototype = Object.create(Employee.prototype); 

var x = new WorkerBee(); 

console.log(x); 

Ausgang: WorkerBee {name: "", dept: "general", projects: Array[0]}

Welche Wirkung hat Employee.call(this); haben? Ich weiß aus dem Ausführen des Codes, dass die Vererbung erfolgreich sein muss. Die Dokumentation für .call() einfach feststellen,

Methode ruft eine Funktion mit einem diesem Wert gegeben und individuell vorgesehen Argumente.

OK, so dass es den Konstruktor ruft Employee() aber es gibt keine new Operator verwendet wird und keine return, die das Objekt zurückkommen würde und es ist Eigenschaften. Wie bewirkt Employee.call(this), dass das untergeordnete Objekt die übergeordneten Eigenschaften erbt?

Wenn diese Zeile weggelassen wird, ist nur das projects Array als Eigenschaft vorhanden.

+3

Diese Frage läuft im Grunde darauf ab, "was' 'call' tun". [MDN-Dokumentation] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call). –

+0

Aufruf eines Konstruktors für ein Objekt setzt in-Konstruktor definierte eigene Eigenschaften für das Objekt. – dandavis

+1

* "Wie bewirkt Employee.call (this), dass das untergeordnete Objekt die übergeordneten Eigenschaften erbt?" * Es erbt nichts. * "Wenn diese Zeile weggelassen wird, ist nur das Projects-Array als Eigenschaft vorhanden." * Und was macht "Employee"? Er weist '' '' 'name' und' deps' zu. Daraus können wir schließen, dass "Employee.call (this)" 'Employee' aufruft und" this "auf das neue Objekt setzt. Vielleicht hilft das, '.call' besser zu verstehen:' function foo() {console.log (this.name); }; foo.call ({Name: 'abc'}); foo.call ({Name: 'xyz'}); '. –

Antwort

2

Was call tut ist einfach ruft die Funktion mit gegebenem Kontext this. In Ihrem Beispiel bedeutet dies, dass die Funktion Employee mit this aufgerufen wird, wobei die Instanz WorkerBee ist. Was in diesem Fall passiert, ist, dass, wenn Employee ausgeführt wird, erstellt und legt eigene Eigenschaften zu dem this Objekt, das zu diesem Zeitpunkt WorkerBee.

überprüfen, welche Konsolenprotokolle, wenn Sie den Code ausführen:

function Employee() { 
    console.log(this instanceof WorkerBee); 
    this.name = ""; 
    this.dept = "general"; 
} 

... und Sie werden sehen, dass this ist in der Tat deutet auf die Objektinstanz von WorkerBee.

Dieses Muster wird verwendet, damit ein Konstruktor eigene Eigenschaften für das externe Hostobjekt (Kontext) erstellt. Es wird auch "Leihkonstruktor" genannt.

+0

Ooh ok macht jetzt vollkommen Sinn. Vielen Dank! –

0

Employee ist nur eine Funktion, wie jede andere Funktion. Bei Verwendung mit dem Operator new handelt es sich um ein neu zugewiesenes Objekt des Typs "Employee", aber das ist nicht die einzige Möglichkeit, es aufzurufen.

Im Szenario, das Sie sich beziehen, ist es einfach füllt die name & dept Eigenschaften von this.

2

Employee.call(this); Führt die Funktion Employee mit this innerhalb der an den Parameter gebundenen Funktion aus. Etwas verwirrend ist der Parameter this. Wenn Employee.call(this); ausgeführt wird, ist this eine Referenz auf das Objekt WorkerBee, das mit new erstellt wird.

Mit Employee.call(this); fügt die Funktion Employee dem Objekt WorkerBee zusätzliche Eigenschaften hinzu.