2016-11-09 68 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