javascript封装与多态的体现
封装是实现面向对象程序设计的第一步,封装就是将数据与函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。
在传统的面向对象语言中有访问修饰符,如Private:只有类本身能存取.Protected:类和派生类可以存取.Public:完全存取.
那么在没有这些访问修饰符的javascript中是怎么实现封装的呢,请看如下代码:
var myObject = (function () {
var __name = 'peak'; //私有变量
return{
getName: function () {
return __name; //公开方法
}
}
})();
console.log(myObject.getName()); // peak
console.log(myObject.__name); //undefined
以上是通过匿名函数立即执行来实现的,myObject返回一个对象中包含getName方法,在getName函数声明的作用域中可以访问到私有属性__name,而myObject外部环境却无法直接访问__name。
多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。
先看一段普通的javascript代码如何渲染地图。
var googleMap = {
show: function () {
console.log('Render Google Map');
}
};
var baiduMap = {
show: function () {
console.log('Render Baidu Map');
}
};
var renderMap = function (type) {
if(type === 'google'){
googleMap.show();
}else if(type === 'baidu'){
baiduMap.show();
}
};
renderMap('google');
renderMap('baidu');
如上写法,假如我们需要增加高德地图,还要修改renderMap函数,往里面堆砌if条件分支语句. 十分不利于代码的复用。
可以借助面向对象多态的思想,把程序相同部分抽离出来,升级写法如下:
var renderMap = function (map) {
if(map.show instanceof Function){
map.show();
}
};
renderMap(googleMap);
renderMap(baiduMap);
#现在增加一个高德地图
var gaodeMap = {
show: function () {
console.log('Render Gaode Map');
}
};
renderMap(gaodeMap);
当然以上写法只是体现多态的思想,并不是说每个地图的渲染方法都是show。