面向对象的JavaScript --- 封装

面向对象的JavaScript --- 封装


封装

封装的目的是将信息隐藏。通常而言,咱们讨论的封装是封装数据和封装实现。真正的封装为更广义的封装,不只包括封装数据和封装实现,还包括封装类型和封装变化。javascript

  • 封装数据
  • 封装实现
  • 封装类型
  • 封装变化

封装数据

在许多语言的对象系统中,封装数据是由语法解析来实现的,这些语言也许提供了 private、public、protected 等关键字来提供不一样的访问权限。但JavaScript并无提供对这些关键字的支持,咱们只能依赖变量的做用域来实现封装特性,并且只能模拟出 public 和 private 这两种封装性。java

除了 ECMAScript 6 中提供的 let 以外,通常咱们经过函数来建立做用域:设计模式

var myObject = (fucntion(){
    var __name = 'sven'; // 私有(private变量)
    return {
        getname: funvtion (){ // 公开(public)方法
            return __name;
        }
    }
})();

console.log(myObject.getName()); // 输出: sven
console.log(myObject.__name); // 输出 undefined

外值得一提的是,在 ECAMScript 6 中,还能够经过 Symbol 建立私有属性。函数

封装实现

封装的目的是将信息隐藏,封装应该被视为“任何形式的封装”,也就是说,封装不只仅是隐藏数据,还包括隐藏实现细节、设计细节以及隐藏对象的类型等。设计

从封装实现细节来说,封装使得对象内部的变化对其余对象而言是透明的,也就是不可见的。对象对它本身的行为负责。其余对象或者用户都不关心它的内部实现。封装使得对象之间的耦合变松散,对象之间只经过暴露的API接口来通讯。当咱们修改一个对象时,能够随意地修改它的内部实现,只要对外的接口没有变化,就不会影响到程序的其余功能。code

封装实现细节的例子很是之多。拿迭代器来讲明,迭代器的做用是在不暴露一个聚合对象的内部表示的前提下,提供一种方式来顺序访问这个聚合对象。咱们编写了一个each函数,它的做用就是遍历一个聚合对象,使用这个 each 函数的人不用关心它的内部是怎样实现的,只要它提供的功能正确即可以。即便each函数修改了内部源代码,只要对外的接口或者调用方式没有变化,用户就不用关心它内部实现的改变。对象

封装类型

封装类型是静态类型语言中一种重要的封装方式。通常而言,封装类型是经过抽象类和接口来进行的。把对象的真正类型隐藏在抽象类或者接口以后,相比对象的类型,客户更关心对象的行为。在许多静态语言的设计模式中,千方百计地去隐藏对象的类型,也是促使这些模式诞生的缘由之一。好比工厂方法模式、组合模式等。固然在 JavaScript 中,并无对抽象类和接口的支持。 JavaScript自己也是一门类型模糊的语言。在封装类型方面, JavaScript 没有能力,也没有必要作得更多。对于JavaScript的设计模式实现来讲,不区分类型是一种失色,也能够说是一种解脱。接口

封装变化

从设计模式的角度出发,封装在更重要的层面体现为封装变化。
《设计模式》一书曾提到以下文字:ip

  “考虑你的设计中哪些地方可能变化,这种方式与关注会致使从新设计的缘由相反。它不是考虑何时会迫使你的设计改变,而是考虑你怎样才可以在不从新设计的状况下进行改变。这里的关键在于封装发生变化的概念,这是许多设计模式的主题。”作用域

这段文字便是《设计模式》提到的“找到变化并封装之”。《设计模式》一书中共概括总结了23种设计模式。从意图上区分, 这 23 种设计模式分别被划分为:

  • 建立型模式
  • 结构型模式
  • 行为型模式

建立型模式: 建立一个对象是种抽象行为,具体建立什么对象是能够变化的,建立型模式的目的是封装建立对象的变化。
结构型模式: 封装的是对象之间的组合关系。
行为型模式: 封装的是对象的行为变化。

经过封装变化的方式,把系统中稳定不变的部分和容易变化的部分隔离开来,在系统的演变过程当中,咱们只须要替换那些容易变化的部分,若是这些部分是已经封装好的,替换起来也相对容易。这能够最大程度地保证程序的稳定性和可扩展性。

从《设计模式》副标题“可复用面向对象软件的基础”能够知道,这本书理应教咱们如何编写可复用的面向对象程序。这本书把大多数笔墨都放在如何封装变化上面,这跟编写可复用的面向对象程序是不矛盾的。当咱们想办法把程序中变化的部分封装好以后,剩下的便是稳定而可复用的部分了。

相关文章
相关标签/搜索