2017-10-17 3 views
2

a fourni le code suivant:ES6 javascript héritage

class Person { 
    constructor(name) { 
     this.name = name; 
    } 
    sayHello() { 
     console.log('Hello, my name is ' + this.name); 
    } 
    sayHelloAndBy() { 
     this.sayHello(); 
     console.log('Bye'); 
    } 

} 
class Student extends Person { 
    constructor(name, grade) { 
     super(name); 
     this.grade = grade; 
    } 
    sayHello() { 
     console.log(`Hi, I'm a studend and my name is ` + this.name); 
    } 
} 


let b = new Student("Some guy", 5); 

b.sayHelloAndBy(); 

Je voudrais trouver un moyen d'appeler sayHello tel que défini dans Person et non Student. C'est possible ?

En php, il y a le self:: qui permet de faire cela, mais je ne suis pas sûr si JS a un concept similaire.

+0

Dépend de f de là où vous voulez l'appeler. Alors, où voulez-vous appeler la méthode sayHello de la personne? –

+0

Vous pouvez utiliser 'super' dans les méthodes pour faire référence à une méthode parente substituée. –

+1

'Person.prototype.sayHello.call (this)' – Ryan

Répondre

4

Vous pouvez vous référer à la version de sayHello définie dans Person par la propriété prototype de Person et l'appeler avec le this nécessaire en utilisant Function#call:

sayHelloAndBye() { 
    Person.prototype.sayHello.call(this); 
    console.log('Bye'); 
} 

Runnable:

class Person { 
 
    constructor(name) { 
 
     this.name = name; 
 
    } 
 
    
 
    sayHello() { 
 
     console.log('Hello, my name is ' + this.name); 
 
    } 
 
    
 
    sayHelloAndBye() { 
 
     Person.prototype.sayHello.call(this); 
 
     console.log('Bye'); 
 
    } 
 
} 
 

 
class Student extends Person { 
 
    constructor(name, grade) { 
 
     super(name); 
 
     this.grade = grade; 
 
    } 
 
    sayHello() { 
 
     console.log(`Hi, I'm a studend and my name is ` + this.name); 
 
    } 
 
} 
 

 
let b = new Student("Some guy", 5); 
 

 
b.sayHelloAndBye();

+0

Je suis assez sûr que c'est ce que le PO recherche. – Cerbrus

+3

Cependant, si c'est le comportement souhaité, une approche plus propre pourrait être de mettre la logique dans une nouvelle méthode qui n'est pas censée être écrasée. C'est à dire. '_sayHello() {...} disonsHello() {this._sayHello();} sayHelloAndBy() {this._sayHello(); ...}' (ou définissez simplement une fonction en dehors de la classe et appelez celle-ci). –