La prima parte è piuttosto comune, è solo un modo per convincere il costruttore del sottotipo a condividere la funzionalità del costruttore del supertipo. Si noti che Person.call
non richiama Person
come costruttore qui, lo richiama come una funzione regolare usando il bind this
dal Student
in costruzione.
Probabilmente è un po 'più comune vederlo scritto in questo modo:
Person.apply(this, arguments);
Se non ti piace l'idea di scrivere esplicitamente il nome del costruttore genitore e stai cercando qualcosa di generico come "super", potresti farlo invece:
this.constructor.prototype.constructor.apply(this, arguments);
Di solito non lo vedi, perché è piuttosto ingombrante e probabilmente hai già un riferimento al costruttore genitore nel punto in cui lo stai facendo comunque.
La seconda parte è ampiamente considerata errata. Non fare questo:
Student.prototype = new Person();
Esegui invece.
Student.prototype = Object.create(Person.prototype);
Object.create(Person.prototype)
ti dà un oggetto con Person.prototype
nella sua catena di prototipi senza eseguire il costruttore di Person
(che potrebbe avere effetti collaterali ed è inutile).