参考书籍: Javascript设计模式与开发实践(曾探)
多态背后的思想是将“做什么”和“谁去做以及怎样去做”分离开来,也就是将“不变的事物”与 “可能改变的事物”分离开来,归根结底先要消除类型之间的耦合关系。 动物都会叫,这是不变的,但是不同类型的动物具体怎么叫是可变的。把不变的部分隔离出来,把可变的部分封装起来,这给予了我们扩展程序的能力,程序看起来是可生长的,也是符合开放—封闭原则的。
JavaScript 是一门不必进行类型检查的动态类型语言,即弱类型的语言。静态类型语言在编译时会进行类型匹配检查。以Java 为例,所以不能给变量赋予不同类型的值。
JavaScript 对象的多态性是与生俱来的。JavaScript 作为一门动态类型语言,它在编译时没有类型检查的过程,既没有检查创建的对象类型,又没有检查传递的参数类型, 我们既可以往makeSound 函数里传递duck 对象当作参数,也可以传递chicken 对象当作参数。
多态最根本的作用就是通过把过程化的条件分支语句转化为对象的多态性,从而消除这些条件分支语句。
在JavaScript 这种将函数作为一等对象的语言中,函数本身也是对象,函数用来封装行为并且能够被四处传递。当我们对一些函数发出“调用”的消息时,这些函数会返回不同的执行结果,这是“多态性”的一种体现,也是很多设计模式在JavaScript 中可以用高阶函数来代替实现的原因。
实例一:
function makeSound(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());
实例二:
var googleMap = {
show: function () {
console.log('开始渲染谷歌地图');
}
};
var baiduMap = {
show: function () {
console.log('开始渲染百度地图');
}
};
function renderMap(map) {
if (map.show instanceof Function) {
map.show();
}
}
renderMap(googleMap);
renderMap(baiduMap);
var sosoMap = {
show: function(){
console.log( '开始渲染搜搜地图' );
}
};
renderMap( sosoMap ); // 输出:开始渲染搜搜地图