【问题标题】:Why do we need private variables?为什么我们需要私有变量?
【发布时间】:2011-08-13 16:11:20
【问题描述】:

它们有什么用,我们如何制作?可以举个例子吗?

【问题讨论】:

  • 你叫什么私有变量?你为什么要问这个问题?请描述得更详细一点。

标签: javascript private-members


【解决方案1】:

例如,为了避免与多个库发生冲突。

假设他们都使用了一个常用的变量,例如data。如果两个库都使用私有变量,那就没问题了:

var lib1 = (function() {
    var data;

    return {
        get: function()  { return data },
        set: function(v) { data = v }
    };
})();

// Supposed to do something different:
var lib2 = (function() {
    var data;

    return {
        get: function()  { return data },
        set: function(v) { data = v }
    };
})();

lib1.set(123);
lib2.set(456);
lib1.get(); // 123
lib2.get(); // 456

但是假设他们不使用私有变量而是像这样使用全局变量:

var lib1 = (function() {
    return {
        get: function()  { return data },
        set: function(v) { data = v }
    };
})();

// Supposed to do something different:
var lib2 = (function() {
    return {
        get: function()  { return data },
        set: function(v) { data = v }
    };
})();

lib1.set(123);
lib2.set(456);
lib1.get(); // 456 - overwritten by lib2. lib1 might not work properly anymore.
lib2.get(); // 456

所以lib1.get() 将获取与lib2.get() 相同的数据。

这个例子当然太明显了,但为了安全起见,最好使用私有变量。

【讨论】:

    【解决方案2】:

    变量被封装在一个类中以防止它们的名称发生冲突。这些可以是公共的或私有的。有时需要确保仅使用设置它们的函数更改变量。例如,需要验证日期的各个部分以阻止某人设置无效日期,例如 2 月 45 日。

    var factorial = (function(){
        var precog = [1,1];// ===undefined for other indices, N = undefined || N
        return function(y){  
            return precog[y] || (precog[y]=y*arguments.callee(y-1));
        };
    })();
    

    这是一个带有私有 precog 的 JavaScript 函数。这存储了以前计算的值,并且阻止它们被操纵是私有的。

    【讨论】:

      【解决方案3】:

      我相信命名空间多个原因。我理解的一种方式是:privateprotectedpublic 表达式在团队环境中很有帮助,因此其他开发人员最终不会使用方法 你不打算让他们这样做。话虽如此,当方法或属性只需要由同一个对象访问时,您只使用private。当您需要继承类来承载相同功能时使用protected,当不同类的对象需要访问您的对象时使用public

      例如:

      Victim 类有

      • 私有方法haveAnxiety()
      • 公共属性出现ToBeRich:Boolean

      Robber

      • 私有方法配置文件(obj:Victim)
      • 私有方法rob(obj:Victim)

      Robber->profile() 需要访问 Victim->appearsToBeRich。如果Victim->appearsToBeRich 返回true,那么Victim 对象将被抢劫Robber 对象永远不需要运行 Victim->haveAnxiety,因为一旦 Victim 对象开始被抢劫,Victim 就会运行 this->haveAnxiety()

      诚然,现实世界的示例比我的示例复杂得多(我希望它们更优雅)。无论如何,我希望这会有所帮助。

      【讨论】:

      • 我不确定这是否与 JavaScript 有关。
      猜你喜欢
      • 1970-01-01
      • 2011-02-04
      • 2023-04-09
      • 2014-06-30
      • 2021-12-21
      • 2019-06-09
      • 2021-10-15
      • 2016-11-18
      相关资源
      最近更新 更多