前面两章感觉有点囫囵吞zao...
在java中通常使用关键字
private
来实现信息的隐藏,表明只有类的内部才能进行调用和访问
在js中没有private关键字,我们是使用闭包
来创建只允许对象内容访问的属性和方法
同样的,每中模式都各有利弊,我们不能武断说哪种模式好或者坏
使用一个函数来做构造器,所有的方法和属性都是公开的 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
可以声明常量嘿嘿
取值器
和复制器
这两个方法,可以获得对取值赋值的完全控制原文:https://www.cnblogs.com/keepOptimistic/p/14927418.html