2017-10-17 145 views
2

提供了以下代碼:ES6 Javascript繼承

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

我想弄清楚調用sayHelloPersonStudent定義,而不是一個辦法。可能嗎 ?

在php中有self::允許一個這樣做,但我不知道JS是否有類似的概念。

+0

取決於f ROM你想叫它的地方。那麼,你想打電話給Person的sayHello方法? –

+0

您可以在方法中使用'super'來引用重寫的父方法。 –

+1

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

回答

4

你可以參考版本的sayHello通過Person的原型財產Person定義,並把它用Function#call必要this

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

我很確定這是OP正在尋找的東西。 – Cerbrus

+3

但是,如果這是所需的行爲,更清晰的方法可能是將邏輯放入不應被覆蓋的新方法中。即'_sayHello(){...} sayHello(){this._sayHello();} sayHelloAndBy(){this._sayHello(); ...}(或簡單地在類之外定義一個函數並調用該函數)。 –