首页 > 编程语言 > 详细

《JavaScript设计模式》章3--封装和信息隐藏

时间:2021-06-24 22:20:21      阅读:16      评论:0      收藏:0      [点我收藏+]

前面两章感觉有点囫囵吞zao...

封装

在java中通常使用关键字private来实现信息的隐藏,表明只有类的内部才能进行调用和访问

在js中没有private关键字,我们是使用闭包来创建只允许对象内容访问的属性和方法

创建对象的基本模式

同样的,每中模式都各有利弊,我们不能武断说哪种模式好或者坏

  1. 门户大开型

使用一个函数来做构造器,所有的方法和属性都是公开的 2. 用命名规范来区分公/私有成员--使用下划线来表示方法和属性的私有性 和第一种如出一辙,但以下划线开头以示其私有性 3. 闭包 先举个小例子

  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可以声明常量嘿嘿

封装之利

  1. 保护了内部数据的完整性
  2. 通过将数据的访问途径限制为取值器复制器这两个方法,可以获得对取值赋值的完全控制
  3. 可以减少其他函数所需的错误检查代码的数量,并确保数据不会处于无效状态
  4. 对象的重构也因此变得轻松,因为用户不知道对象的内部细节,你可以随心所欲的修改

封装之弊

  1. 私有化的方法很难进行单元测试
  2. 使用闭包会和复杂的作用域链打交道,使得错误调试更加困难
  3. 容易过度封装
  4. 对新手不友好

《JavaScript设计模式》章3--封装和信息隐藏

原文:https://www.cnblogs.com/keepOptimistic/p/14927418.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!