多态在面向对象程序设计中的作用:
就js多态性问题就行考究下:
多态是面向对象编程语言中最重要的技术 利用对象的多态 ,对象 应 做什么并不是临时决定的, 而是已经事先约定和排练完毕的。 每个对象应该做什么,已经成为了对象的一个方法, 被封装在对象的内部,每个对象负责它们自己的行为。 所以这些对象可以根据同一个消息,分别进行各自的工作。 行为分布在各个对象中,并让这些对象各自负责自己的行为,这正是面向对象设计的优点。
设我们要编写一个地图应用,现在有两家可选的地图API提供我们自己的应用。目前我们选择的是谷歌地图,谷歌地图的 API 中提供了show 方法,负责在页面上展示地图。var googleMap = { show: function(){ console.log( '谷歌地图' ); } }; var renderMap = function(){ googleMap.show(); }; renderMap(); //输出:
后来由于某些原因,需要把谷歌地图换成百度地图,为了让renderMap函数保持一定的弹性,我可以采用一些条件分支来renderMap函数同时支持谷歌和百度;var gooleMap = { show:function(){ console.log('谷歌地图'); } }; var baiduMap = { show:function(){ console.log('百度地图'); } }; var renderMap = function(type){ if(type === 'google'){ gooleMap.show(); }else if(type === 'baidu'){ baiduMap.show(); } }; renderMap('google');// renderMap('baidu');
虽然保持来一定程度的弹性,但是,还是比较脆弱的,如果再增加个搜狗地图,我们就还得修改renderMap函数;
所以,我就把程序中相同的部分抽象出来,那就显示某个地图;var renderMap = function(map){ if(map.show instanceof Function){ map.show(); } }; renderMap(gooleMap);// renderMap(baiduMap);
现在我们来找这段代码的多态性。当我们向谷歌地图和百度地图对象分别发出“展示地图”的消息时,会分别调用它们的show方法,就会产生不同的结果。对象的多态性提示我们,‘做什么’和‘怎么去做’是可以分开的,即使以后增加其他地图,renderMap函数仍然不需要改变;var sosoMap = { show:function(){ console.log('嗖嗖地图'); } }; renderMap(sosoMap);