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à.
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). –
chiamando un costruttore su un oggetto imposta le proprietà proprie del costruttore definite nell'oggetto. – dandavis
* "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'}); '. –