2016-11-09 43 views
0
class Dog { 
    bark() { 
    console.log(`Dog.bark`) 
    } 
    callMyBark() { 
    // how do I have this function use the bark above and not Pug.bark? 
    this.bark() 
    } 
} 

class Pug extends Dog { 
    bark() { 
    console.log(`Pug.bark`) 
    } 
    callMyBark() { 
    super.callMyBark() 
    } 
} 

let pug = new Pug() 

pug.callMyBark() 

上面的代碼記錄Pug.bark和預期的行爲是登錄Dog.bark。我怎樣才能讓Dog.callMyBark方法運行Dog.bark問題使用此函數調用時調用類的方法,使用超

+0

動態調用方法的重點是允許它們被覆蓋? – Bergi

+0

如果你不想在標準的面向對象類中重寫'bark',或許你應該重新考慮你是如何調用這個函數的?你能把它作爲助手完全從課堂上移走,然後從兩個地方撥打助手嗎? – loganfsmyth

回答

2

有幾個方法可以做到這一點,但我認爲最好是調用super方法或者根本不覆蓋:

class Pug extends Dog { 
    bark() { 
    super.bark(); // or omit the method entirely 
    } 

    callMyBark() { 
    super.callMyBark() 
    } 
} 

顯然不會考慮到你在哪裏打電話來,這似乎是你想如何決定。

請記住,選擇基於調用方法的方法在大多數OO語言中都是反模式,並且已經做了大量工作以避免意外執行此操作(這是C++中的一個問題,這是後來的一部分)語言默認爲虛擬調度)。

我會強烈建議把功能static或一些分離幫手,如果你真的需要直接調用它:

class Dog { 
    static bark() { 
    console.log(`Dog.bark`) 
    } 

    callMyBark() { 
    // how do I have this function use the bark above and not Pug.bark? 
    Dog.bark() 
    } 
} 

如果您在函數中需要this,你可以通過一個實例來的幫手,或者您也可以通過原型(或實例的原型鏈)稱:

class Dog { 
    bark() { 
    console.log(`Dog.bark`) 
    } 

    callMyBark() { 
    // how do I have this function use the bark above and not Pug.bark? 
    Dog.prototype.bark.call(this); 
    } 
} 

沒有漂亮的解決方案,可能是因爲這通常可以被避免。

+0

在最後一個例子中,你可以使用'super.bark.call(this)'而不是顯式調用'Dog'類 – CodingIntrigue