封装的 目的 是将信息隐藏。一般而言,我们讨论的封装是 封装数据 和 封装实现。更广义的封装,不仅包括封装数据和封装实现,还包括 封装类型 和 封装变化。
在许多语言的对象系统中,封装数据是由语法解析来实现的,这些语言也许提供了private、public、protected 等关键字来提供不同的访问权限。
但JavaScript 并没有提供对这些关键字的支持,我们只能依赖 变量的作用域 来实现封装特性,而且只能模拟出public 和private 这两种封装性。
封装的目的是将信息隐藏,封装应该被视为“任何形式的封装”,也就是说,封装不仅仅是隐藏数据,还包括隐藏实现细节、设计细节以及隐藏对象的类型等。
从封装实现细节来讲,封装使得对象内部的变化对其他对象而言是透明的,也就是不可见的。对象对它自己的行为负责。其他对象或者用户都不关心它的内部实现。封装使得对象之间的耦合变松散,对象之间只通过暴露的API 接口来通信。
封装数据: 常用。
封装类型: JavaScript 没有能力,也没有必要做。
封装变化: 从设计模式的角度出发,封装在更重要的层面体现为封装变化。通过封装变化 的方式,把系统中稳定不变的部分和容易变化的部分隔离开来, 在系统的演变过程中,我们只需要替换那些容易变化的部分,如果这些部分是已经封装好的,替换起来也相对容易。这可以最大程度地保证程序的稳定性和可扩展性。
封装数据
var myObject = (function () {
var __name = 'sven'; // 私有(private)变量
return {
getName: function () { // 公开(public)方法
return __name;
}
}
})();
console.log(myObject.getName()); // 输出:sven
console.log(myObject.__name) // 输出:undefined