封装, 即隐藏对象的属性和实现细节, 仅对外公开接口, 控制在程序中属性的读和修改的访问级别; 将抽象得到的数据和行为 (或功能) 相结合, 形成一个有机的整体, 也就是将数据与操作数据的源代码进行有机的结合, 形成 "类", 其中数据和函数都是类的成员.
为什么要封装?
大家在日常开发过程中, 具有相同处理逻辑的代码通常会进行函数的封装来减少代码的冗余, 使代码看起来更优雅美观, 那么
当多个实体对象他们拥有相同的一些属性和行为 (方法) 时, 自然也要把这些相同的属性和行为抽象出来, 减少不必要的代码.
封装数据
JavaScript 没有提供 private,public,protected 等关键字来实现不同的访问权限, 只能依赖变量的作用域来实现封装特性, 而且只能模拟出 private,public 两种封装性.
除了 ES6 中提供的 let 以外, 一般通过函数来创建作用域.
- var obj = (function() {
- var name = "Alice"; // 模拟 private 变量
- return {
- getName: function() { // 模拟 public 方法
- return name;
- }
- }
- })();
- console.log(obj.name); // 输出: undefined
- console.log(obj.getName()); // 输出: Alice
封装实现
从封装实现细节来讲, 封装使得对象内部的变化对其他对象而言是透明的, 也就是不可见的, 对象对自己的行为负责, 其他对象或用户不关心其内部实现. 封装使得对象之间的耦合变松散, 对象之间只通过暴露的 API 接口来通信. 修改一个对象时, 可以随意修改它的内部实现, 只要对外的接口没有变化, 就不会影响程序的其他功能.
例如, 迭代器的作用是在不暴露一个聚合对象的内部表示的前提下, 提供一种方式来顺序访问这个聚合对象, 若有一个 each 函数, 则使用它的人不必关心其内部实现, 只有它可以提供正确的功能即可, 即使 each 函数修改了源代码, 只要对外的接口或调用方式没有变化, 用户就不必关心其内部实现的改变.
封装类型
封装类型是静态类型语言的一种重要封装方式. 一般而言, 封装类型是通过抽象类和接口来进行的, 将对象的类型隐藏到抽象类或接口之后, 相比对象的类型, 用户更关心对象的行为. 在许多静态类型语言的设计模式中, 会想方设法地隐藏对象的类型, 促使工厂模式, 组合模式等设计模式诞生.
在 JavaScript 中, 并没有对抽象类和接口的支持, 在封装类型方面, JavaScript 没有能力.
来源: http://www.css88.com/qa/javascript/11287.html