zoukankan      html  css  js  c++  java
  • Effective JavaScript Item 35 使用闭包来保存私有数据

    本系列作为EffectiveJavaScript的读书笔记。

     

    JavaScript的对象系统从其语法上而言并不鼓舞使用信息隐藏(Information Hiding)。由于当使用诸如this.namethis.passwordHash的时候,这些属性默认的訪问级别就是public的。在不论什么位置都可以通过obj.nameobj.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;
    	};
    }
    

    此时,namepasswordHash都没有被保存为实例的属性。而是通过局部变量进行保存。然后依据闭包的訪问规则,实例上的方法能够对它们进行訪问,而在其他地方则不能。

     

    使用这样的模式的一个缺点是,利用了局部变量的方法都须要被定义在实例本身上,不能讲这些方法定义在prototype对象上。

    正如在Item34中讨论的那样,这样做的问题是会添加内存的消耗。可是在某些特别的场合下,即使将方法定义在实例上也是可行的。

     

    总结:

    1. 闭包中定义的变量是私有的,仅仅能在闭包中被引用。
    2. 使用闭包来实现方法中的信息隐藏。

  • 相关阅读:
    收藏的一个Sqlserver性能查询,包括查询CPU 网络等
    转载自博客园的一篇文章 通过SQL Server Profiler来监视分析死锁
    关于Sqlserver的换行和空格
    Sql Server查询性能优化之不可小觑的书签查找
    临时表和表变量,转载自博客园
    Sqlserver活动视图
    代码列表 4.5:显示累计最消耗 CPU 时间的前50个运行计划
    关于Sqlserver2012分页的新功能尝试
    sqlserver 东八时区的英文时间转换
    Flash应用效率优化启示录Ⅰ
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5380160.html
Copyright © 2011-2022 走看看