《JavaScript设计模式》章3--封装和信息隐藏
前面两章感觉有点囫囵吞zao...
封装
在java中通常使用关键字
private来实现信息的隐藏,表明只有类的内部才能进行调用和访问
在js中没有private关键字,我们是使用闭包来创建只允许对象内容访问的属性和方法
创建对象的基本模式
同样的,每中模式都各有利弊,我们不能武断说哪种模式好或者坏
- 门户大开型
使用一个函数来做构造器,所有的方法和属性都是公开的
- 用命名规范来区分公/私有成员--使用下划线来表示方法和属性的私有性
和第一种如出一辙,但以下划线开头以示其私有性
- 闭包
先举个小例子
function foo() {
let a = 1;
funtion bar() {
a *= 2;
return a;
}
return bar;
}
//上面的foo看做一个类
let test1 = foo()
let test2 = foo()
//执行测试
test1() //2
test1() //4
test2() //2
前两个test1执行之后可以发现,foo函数中的a变量已经私有化(只能通过内部的bar函数进行访问);
而test2执行可以发现,test1和test2相当与类foo的两个实例,相互之间互不影响(test1和test2中的a互不影响)
这种对象创建模式不利于派生子类,因为派生出的子类不能访问超类中的任何属性和方法,因此也被称为“继承破坏封装”
更高级的对象创建模式
静态方法和属性
在介绍下面这种对象创建模式之前,先说一下静态的概念
静态成员所关联的是类本身,
换句话说就是,静态成员实在类的层次上操作,而不是在实例的层次上操作,
也就是说,每个静态成员只有一份
对象创建尝试
前面一个小例子中,test2第一次执行的时候输出2, 也就是说foo中的a不是静态的,不是独一份
//这里将类名大写, 其实跟之前的foo一样,只不过这样规范一些
let Foo = (function() {
let a = 2
return function() {
a *= 2
return a
}
})()
//创建实例,
let test1 = Book
let test2 = Book
let test3 = Book
//执行测试
console.log(test1()) //4
console.log(test1()) //8
console.log(test2()) //16
console.log(test3()) //32
可以看到,我们达到了私有化并且 独一份的目的。
虽然我也是有点懵,但是就是这么牛逼
常量
这个我选择略过,毕竟现在有
const可以声明常量嘿嘿
封装之利
- 保护了内部数据的完整性
- 通过将数据的访问途径限制为
取值器和复制器这两个方法,可以获得对取值赋值的完全控制 - 可以减少其他函数所需的错误检查代码的数量,并确保数据不会处于无效状态
- 对象的重构也因此变得轻松,因为用户不知道对象的内部细节,你可以随心所欲的修改
封装之弊
- 私有化的方法很难进行单元测试
- 使用闭包会和复杂的作用域链打交道,使得错误调试更加困难
- 容易过度封装
- 对新手不友好

浙公网安备 33010602011771号