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。

posted @ 2016-10-02 10:48  peakleo  阅读(330)  评论(0编辑  收藏  举报