如何在Javascript中使用多态性

如何在Javascript中使用多态性,javascript,inheritance,polymorphism,Javascript,Inheritance,Polymorphism,大多数语言对类使用单一继承。这样做的模式非常明显(例如在下面的Swift代码中)。我仍然在尝试用JavaScript来创建对象层次结构,重用类函数和重写类函数 class animal { func talk() { print ("?") } } class bird : animal { override func talk() { print("tweet tweet") } func fly() {

大多数语言对类使用单一继承。这样做的模式非常明显(例如在下面的Swift代码中)。我仍然在尝试用JavaScript来创建对象层次结构,重用类函数和重写类函数

class animal {
    func talk() {
        print ("?")
    }
}

class bird : animal {
    override func talk() {
        print("tweet tweet")
    }
    func fly() {
        print("flap flap")
    }
}

class parrot : bird {
    override func talk() {
        print("polly want a cracker")
    }
}

var a = animal()
var b = bird()
var p = parrot()

a.talk()  /// ?
b.talk()  /// tweet tweet
b.fly()   /// flap flap
p.talk()  /// polly want a cracker
p.fly()   /// flap flap

我认为我的问题是Javascript代码看起来不像这样。我可以找出模式的等效Javascript代码是什么?

您基本上回答了自己的问题。你只需要学习JavaScript的语法就可以了

我认为我的问题是Javascript代码看起来不像这样

  • 如果一种语言与另一种语言看起来不同,这对你来说不是一个“问题”

  • 您提供的Swift代码在语法上非常接近您需要编写的JavaScript(ES6),以表示相同的类层次结构

  • 类动物{
    谈话{
    console.log(“?”)
    }
    }
    鸟类动物{
    谈话{
    console.log('tweet-tweet')
    }
    苍蝇{
    console.log('flap-flap')
    }
    }
    类鹦鹉延伸鸟{
    谈话{
    log('polly想要一个饼干')
    }
    }
    var a=新动物()
    var b=新鸟()
    var p=新鹦鹉()
    a、 谈话
    b、 谈话
    b、 苍蝇
    p、 谈话
    
    p、 fly()
    有两个答案,ES6:

    类动物{
    谈话{
    控制台日志(“?”)
    }
    }
    鸟类动物{
    谈话{
    console.log(“tweet tweet”)
    }
    苍蝇{
    控制台。原木(“翻板”)
    }
    }
    类鹦鹉延伸鸟{
    谈话{
    log(“polly想要一个饼干”)
    }
    }
    var a=新动物()
    var b=新鸟()
    var p=新鹦鹉()
    a、 谈话()//?
    b、 talk()///tweet tweet
    b、 fly()///襟翼
    p、 talk()///波利想要个饼干吗
    
    p、 fly()///flap flap
    我以为Javascript不支持“class”关键字?ES6支持
    class
    关键字。它是一种语法糖,完全相同的代码可以用ES5或更低版本表示。谢谢。正是我需要的。顺便说一句,所谓的重复问题的答案甚至没有提到ES6方式,而这正是我所追求的。@naomik所以基本上
    talk()
    bird and parrot中的动物方法被覆盖了?@naomik我们也能做过载吗?可能重复的是,不是nitpik,但这个问题有点像“what is”一样杂乱无章问题的一部分。我对此没有问题,只需要对“如何”转换它进行一对一的比较。bird.call(this)是什么?它调用bird构造函数使parrot的实例初始化为bird。如果鸟类构造器或动物构造器中有任何内容,则会执行。感谢您的回复。还有一个简短的问题。为什么我们必须像在
    {constructor:{value:parrot}
    中那样将构造函数指向parrot?如果我们不这样做会发生什么?如果你不这样做,这通常并不重要,但它会导致parrot.prototype.constructor==bird。这不会导致新的parrot()只创建一个bird,所以这不是什么大问题,但是ES5语法的要点是几乎准确地显示ES6语法在做什么,除了一些技术,否则会使代码完全不可读(例如,使每个原型方法都像ES6类一样不可枚举)