猿问

js 多态如何理解,最好能有个例子

最近读到一本书《JavaScript设计模式与开发实践》上,讲到js的多态,我在JavaScript高级程序编程里貌似都没有见过关于这个的详细讲解,所以想问问大家有没有什么推荐的文章或者博客,可以推荐给小弟的,让小弟可以深入了解一下。
先把那本上的例子拿出来跟大家分享:
书里面的故事:本人家里养了一只鸡,一只鸭。当主人向他们发出‘叫’的命令时。鸭子会嘎嘎的叫,而鸡会咯咯的叫。转化成代码形式如下
非多态代码示例
varmakeSound=function(animal){
if(animalinstanceofDuck){
console.log('嘎嘎嘎');
}elseif(animalinstanceofChicken){
console.log('咯咯咯');
}
}
varDuck=function(){}
varChiken=function(){};
makeSound(newChicken());
makeSound(newDuck());
多态的代码示例
varmakeSound=function(animal){
animal.sound();
}
varDuck=function(){}
Duck.prototype.sound=function(){
console.log('嘎嘎嘎')
}
varChiken=function(){};
Chiken.prototype.sound=function(){
console.log('咯咯咯')
}
makeSound(newChicken());
makeSound(newDuck());
多态背后的思想是将”做什么“和”谁去做以及怎样去做分开“。
九州编程
浏览 424回答 2
2回答

暮色呼如

同一个实现接口,使用不同的实例而执行不同的操作。比如:打印机可以看作是父类,黑白打印机、彩色打印机是他的两个子类。父类打印机中的方法“打印”在每个子类中有各自不同的实现方式,比如对黑白打印机执行打印操作后,打印效果是黑白的,而对彩色打印机进行打印操作后,打印效果是彩色的。

肥皂起泡泡

到底什么是多态?这本身就是一个抽象的概念。宽泛的,你可以这么理解:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。换句话说,给不同的对象发送同一个消息的时候,这些对象会根据这个消息分别给出不同的反馈。(某某百科)本质上也就如题主说描述的“将‘做什么’和‘谁去做以及怎样去做’分开”,归根结底就是先消除不同对象的耦合关系。举个让对象表示出多态性的最常用的例子说明一下://使用es6class简化代码classParent{sayName(){console.log('Parent');}}classChildextendsParent{sayName(){console.log('Child');}}varchild=newChild();child.sayName();//'Child'varparent=newParent();parent.sayName();//'Parent'上面代码中,我想要child对象和parent对象分别调用告诉我他们的名字(name),他们分别调用告诉我名字的方法(sayName)却得到了不同的结果。尽管这实际上是在子类对象原型上创建了与父类对象原型同名的属性和方法。但这就是一个多态。多态分为编译时多态和运行时多态。其中编辑时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。由于JavaScript并不存在方法重载,并且在继承方面也与传统的接口/类不同,所以在JavaScript中大多是通过子类重写父类方法的方式实现多态,就像上面这段代码一样,但是也可以通过一些别的方式来实现多态,毕竟这只是一种思想或者说是模式,比如包括但不仅限于这种方法://以下代码基于上述代码functionsayAge(object){if(objectinstanceofChild){console.log('10');}elseif(objectinstanceofParent){console.log('30');}}sayAge(child);//'10'sayAge(parent);//'30'不使用重写,通过if/else的判断,我们也得到了一个多态的实现:我想让他们告诉我他们的年龄(age),他们调用让我得到年龄的方法(sayAge)分别得到了不同的结果,这也是一个多态。只是这个多态具有较差的可扩展性而已,当然你可以改写sayAge,以获得更高的可扩展性:functionsayAge(object){object.prototype.sayAge();}当改写成这样,你没发现这实际上就是在一个对象原型上创建了与另一个对象原型同名的属性和方法吗?其实这种偏向设计模式的东西已经超出我这个渣渣的能力范围,这不是看一本书做一道题就能解决的,等有新的想法了我再来补充。思考的方式可能存在问题,还请批评指正。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答