JavaScript面向对象编程之多态
多态
同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果,换句话说,给不同的对象发送同一个消息的时候,这些对象会根据这个消息分别给出不同的反馈。
示例
var googleMap = {
show: function() {
console.log('开始渲染谷歌地图');
}
}
var baiduMap = {
show: function() {
console.log('开始渲染百度地图');
}
}
var renderMap = function(type) {
if (type === 'google') {
googleMap.show();
} else if (type === 'baidu') {
baiduMap.show();
}
}
renderMap('google'); // 开始渲染谷歌地图
renderMap('baidu'); // 开始渲染百度地图
可以看到,虽然 renderMap 函数目前保持了一定的弹性,但这种弹性是很脆弱的,一旦需要替换成搜搜地图,那无疑必须得改动 renderMap 函数,继续往里面堆砌条件分支语句。
多态的思想实际是把 “做什么” 和 “谁去做” 分离出来,要实现这一点,归根结底先要消除类型之前的耦合关系。
我们还是先把程序中相同的部分抽象出来,那就是显示某个地图:
var googleMap = {
show: function() {
console.log('开始渲染谷歌地图');
}
}
var baiduMap = {
show: function() {
console.log('开始渲染百度地图');
}
}
var renderMap = function(map) {
if (map.show instanceof Function) {
map.show();
}
}
renderMap(googleMap); // 开始渲染谷歌地图
renderMap(baiduMap); // 开始渲染百度地图
var sosoMap = {
show: function() {
console.log('开始渲染搜搜地图');
}
}
renderMap(sosoMap);