如何在Javascript中使用多态性
大多数语言对类使用单一继承。这样做的模式非常明显(例如在下面的Swift代码中)。我仍然在尝试用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() {
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代码看起来不像这样
类动物{
谈话{
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类一样不可枚举)