Fa diventare Parent.call dall'oggetto figlio un modo giusto per implementare l'ereditarietà in JavaScript?

3

Mi sono imbattuto in questo pezzo di codice. Non mi sembrava giusto. È questo il modo giusto per implementare super in JavaScript? In caso contrario, qual è la strada giusta?

function Person(name){
  this.name = name;  
}

function Student(name){
  Person.call(this, name);
}

Student.prototype = new Person(); 
var a = new Student('test');
var b = new Student('test2');
    
posta djd 02.09.2014 - 17:53
fonte

2 risposte

2

Questo funziona ed è il modo giusto in base al fatto che il browser supporti Object.create :

Student.prototype = Object.create(Person.prototype);

Il metodo Object.create imposta l'ereditarietà del prototipo senza eseguire la funzione di costruzione Person quando "eredita".

    
risposta data 02.09.2014 - 18:51
fonte
1

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

    
risposta data 01.12.2014 - 22:09
fonte

Leggi altre domande sui tag