2015-06-23 14 views
6

codice ottenuto da MDN:eredità JavaScript con .Call (questo)

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); 

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

Che effetto ha Employee.call(this); ha? So per aver eseguito il codice che è necessario che l'ereditarietà abbia successo. La documentazione per .call() semplicemente affermano,

metodo richiama una funzione con un dato questo valore ed argomenti addotti individualmente.

OK quindi chiama il costruttore Employee() ma non c'è new dell'operatore utilizzato e non return che sarebbe tornato l'oggetto e le sue proprietà. In che modo Employee.call(this) l'oggetto figlio eredita le proprietà padre?

Se questa riga viene omessa, solo la matrice projects è presente come proprietà.

+3

Questa domanda si riduce fondamentalmente a "cosa fa" .call' do ". [Documentazione MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call). –

+0

chiamando un costruttore su un oggetto imposta le proprietà proprie del costruttore definite nell'oggetto. – dandavis

+1

* "In che modo Employee.call (this) fa in modo che l'oggetto figlio erediti le proprietà padre?" * Non eredita nulla. * "Se questa linea viene lasciata fuori, solo l'array di progetti è presente come proprietà." * E cosa fa 'Employee'? Assegna 'nome' e' deps' a 'questo'. Quindi possiamo concludere che 'Employee.call (this)' chiama 'Employee' e imposta il suo' this' al nuovo oggetto. Forse questo aiuta a capire meglio '.call':' function foo() {console.log (this.name); }; foo.call ({name: 'abc'}); foo.call ({name: 'xyz'}); '. –

risposta

2

Ciò che call fa è semplicemente invocare la funzione con il contesto dato this. Nel tuo esempio significa che la funzione Employee viene chiamata con this all'interno di essa istanza di WorkerBee. Quindi, ciò che accade in questo caso è che quando viene eseguito Employee crea e imposta proprietà proprie sull'oggetto this che al momento è WorkerBee.

Verifica a quanto i registri console quando si esegue il codice:

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

... e vedrete che è davvero this punti per l'istanza dell'oggetto di WorkerBee.

Questo modello viene utilizzato per fare in modo che un costruttore crei le proprie proprietà sull'oggetto host esterno (contesto). Si chiama anche "costruttore in prestito".

+0

Ooh ok ha perfettamente senso ora. Grazie! –

0

Employee è solo una funzione, come qualsiasi altra funzione. Se utilizzato con l'operatore new, agisce su un oggetto appena assegnato del "tipo" Employee, ma non è l'unico modo per richiamarlo.

Nello scenario a cui ti riferisci, riempie semplicemente il name & dept proprietà di this.

2

Employee.call(this); esegue la funzione Employee con this all'interno della funzione associata al parametro. Un po 'confusamente, il parametro è this. Quando viene eseguito Employee.call(this);, this è un riferimento all'oggetto WorkerBee che viene creato con new.

Con Employee.call(this);, la funzione Employee aggiunge proprietà aggiuntive all'oggetto WorkerBee.