「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。
正文
多态在希腊文叫做polymorphism poly(复数)+ morph(形态)+ ism 很明显就是很多个形态
多态的意思就是:给不同的对象发出同一种操作,它们会返回不同的执行结果,所谓“一呼百应”
还是讲个故事吧:一个农夫养了一只鸡和一只鸭,当农夫发出 叫 的指令时,狗和鸡都会回应农夫,但是叫声各不相同
这就是多态的思想,同样的,我们再用代码的方式解释一下什么是多态
var makeSound = function( animal ){
if ( animal instanceof Duck ){
console.log( '嘎嘎嘎' );
}else if ( animal instanceof Chicken ){
console.log( '咯咯咯' );
}
};
var Duck = function(){};
var Chicken = function(){};
makeSound( new Duck() ); // 嘎嘎嘎
makeSound( new Chicken() ); // 咯咯咯
这段代码确实能体现多态,但是并不是很符合要求,当我们又新加入一只动物比方说狗,狗的叫声是“汪汪汪”,我们就必须修改makeSound函数往里面添加一只狗和狗叫的方法,修改代码总是危险的,越是修改代码越容易报错,而且如果动物多了的话,makeSound很容易变得很庞大。形成一个巨大的函数体。
多态背后的含义是什么,将做什么和谁去做怎么做分离开来,把不变的分离出来,把可变的封装起来,这样就显得代码十分的优雅和安全
对象的多态性
我们把不变的分离出来(也就是所有的动物都会发出声音),把可变的封装进去(不同动物的声音)。
var makeSound = function( animal ){
animal.sound();
};
var Duck = function(){};
Duck.prototype.sound = function(){
console.log( '嘎嘎嘎' );
};
var Chicken = function(){};
Chicken.prototype.sound = function(){
console.log( '咯咯咯' );
};
makeSound( new Duck() ); // 嘎嘎嘎
makeSound( new Chicken() ); // 咯咯咯
var Dog = function(){};
Dog.prototype.sound = function(){
console.log( '汪汪汪' );
};
makeSound( new Dog() ); // 汪汪汪
就算我们要增加一只狗的叫声,只需要添加一段代码就好了,而不去像之前去修改makeSound函数
java中的类型检查和多态
类型检查一直是多态绕不开的话题,但是骄JavaScript是一个不需要类型检查的动态类型语言,反观在java中,我们需要在代码执行的过程中进行严格的类型检查,所以不能随意给变量赋予不同类型的值,显得代码很僵硬,一点都不优雅,例如
String str
str = "abc"// true
str = 3 //flase
类型检查严格会使得代码很安全,但是这会局限我们的操作,总感觉被束缚了手脚,通常可以用向上类型的转换来解决这一问题,java过多的我不是很了解,大家能明白我说的什么意思就行。
JavaScript的多态
从前面的讲解我们了解到,JavaScript的多态实际上就是把做什么和谁去做怎么做分离开来,因为JavaScript的类型是在运行期间是可变的。一个JavaScript对象既表示Duck类型对象也表示Chicken类型对象,这是JavaScript与生俱来的。
正是因为没有类型的检查机制,也没有传递参数的检查机制,某一种动物是否发出叫声,发出什么叫声,只取决于是否拥有makeSound方法,这正是我们从鸭子类型中总结出来的道理