最近读到一本书《JavaScript设计模式与开发实践》上,讲到js的多态,我在JavaScript高级程序编程里貌似都没有见过关于这个的详细讲解,所以想问问大家有没有什么推荐的文章或者博客,可以推荐给小弟的,让小弟可以深入了解一下。
先把那本上的例子拿出来跟大家分享:
书里面的故事:本人家里养了一只鸡,一只鸭。当主人向他们发出‘叫’的命令时。鸭子会嘎嘎的叫,而鸡会咯咯的叫。转化成代码形式如下
非多态代码示例
var makeSound = function(animal) {
if(animal instanceof Duck) {
console.log('嘎嘎嘎');
} else if (animal instanceof Chicken) {
console.log('咯咯咯');
}
}
var Duck = function(){}
var Chiken = function() {};
makeSound(new Chicken());
makeSound(new Duck());
多态的代码示例
var makeSound = function(animal) {
animal.sound();
}
var Duck = function(){}
Duck.prototype.sound = function() {
console.log('嘎嘎嘎')
}
var Chiken = function() {};
Chiken.prototype.sound = function() {
console.log('咯咯咯')
}
makeSound(new Chicken());
makeSound(new Duck());
多态背后的思想是将”做什么“和”谁去做以及怎样去做分开“。
到底什么是多态?这本身就是一个抽象的概念。宽泛的,你可以这么理解:
举个让对象表示出多态性的最常用的例子说明一下:
上面代码中,我想要child对象和parent对象分别调用告诉我他们的名字(name),他们分别调用告诉我名字的方法(sayName)却得到了不同的结果。尽管这实际上是在子类对象原型上创建了与父类对象原型同名的属性和方法。但这就是一个多态。
由于JavaScript并不存在方法重载,并且在继承方面也与传统的接口/类不同,所以在JavaScript中大多是通过子类重写父类方法的方式实现多态,就像上面这段代码一样,但是也可以通过一些别的方式来实现多态,毕竟这只是一种思想或者说是模式,比如包括但不仅限于这种方法:
不使用重写,通过if/else的判断,我们也得到了一个多态的实现:我想让他们告诉我他们的年龄(age),他们调用让我得到年龄的方法(sayAge)分别得到了不同的结果,这也是一个多态。只是这个多态具有较差的可扩展性而已,当然你可以改写sayAge,以获得更高的可扩展性:
当改写成这样,你没发现这实际上就是在一个对象原型上创建了与另一个对象原型同名的属性和方法吗?
其实这种偏向设计模式的东西已经超出我这个渣渣的能力范围,这不是看一本书做一道题就能解决的,等有新的想法了我再来补充。
思考的方式可能存在问题,还请批评指正。