Effective JavaScript Item 35 使用闭包来保存私有数据
本系列作为EffectiveJavaScript的读书笔记。
JavaScript的对象系统从其语法上而言并不鼓舞使用信息隐藏(Information Hiding)。由于当使用诸如this.name。this.passwordHash的时候,这些属性默认的訪问级别就是public的。在不论什么位置都可以通过obj.name,obj.passwordHash来对这些属性进行訪问。
在ES5环境中,也提供了一些方法来更方便的訪问一个对象上全部的属性,比方Object.keys(),Object.getOwnPropertyNames()。所以,一些开发者使用一些规约来定义JavaScript对象的私有属性,比方最典型的是使用下划线作为属性的前缀来告诉其它开发者和用户这个属性是不应该被直接訪问的。
可是这样做,并不能从根本上解决这个问题。其它开发者和用户还是可以对带有下划线的属性进行直接訪问。
对于确实须要私有属性的场合,可以使用闭包进行实现。
从某种意义而言,在JavaScript中,闭包对于变量的訪问策略和对象的訪问策略是两个极端。闭包中的不论什么变量默认都是私有的,仅仅有在函数内部才干訪问这些变量。比方,能够将User类型实现例如以下:
function User(name, passwordHash) {
this.toString = function() {
return "[User " + name + "]";
};
this.checkPassword = function(password) {
return hash(password) === passwordHash;
};
}
此时,name和passwordHash都没有被保存为实例的属性。而是通过局部变量进行保存。然后依据闭包的訪问规则,实例上的方法能够对它们进行訪问,而在其他地方则不能。
使用这样的模式的一个缺点是,利用了局部变量的方法都须要被定义在实例本身上,不能讲这些方法定义在prototype对象上。
正如在Item34中讨论的那样,这样做的问题是会添加内存的消耗。可是在某些特别的场合下,即使将方法定义在实例上也是可行的。
总结:
- 闭包中定义的变量是私有的,仅仅能在闭包中被引用。
- 使用闭包来实现方法中的信息隐藏。
最新文章
- mongoose - 让node.js高效操作mongodb
- 使用极光推送(www.jpush.cn)向安卓手机推送消息【服务端向客户端主送推送】C#语言
- 黑马程序员——C语言基础 函数
- centos终端中mysql中文显示乱码的处理
- WPF standard ComboBox Items Source Change Issue
- javascript闭包详解
- YII设置用户访问过滤
- Gulp browserify livereload
- Apache介绍
- bzoj 4199 [NOI2015]寿司晚宴
- Oracle 中Return 和exit的区别
- LintCode Sqrt(x)
- ExtJS学习之MessageBox
- Eclispe让SVN插件显示英文
- tomcat:8080/返回404;/etc/hosts(identifier-Namespace-scope)
- [原]Failed to load SELinux policy. System Freezing ----redhat7or CentOS7 bug
- Qt编译目录下exe文件执行报错问题的解决办法
- 8-7 Unique Snowflakes UVA11572
- 2013年五大主流浏览器 HTML5 和 CSS3 兼容性大比拼【转】
- 解决mac休眠睡眠异常耗电方法