为什么我们需要私有变量?

时间:2011-08-13 16:11:20

标签: javascript private-members

它们是什么,我们如何制作它?你能举个例子吗?

3 个答案:

答案 0 :(得分:8)

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

假设他们都使用常用的变量,例如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()相同的数据。

这个例子当然太明显了,但为了保持安全,使用私有变量是一个好习惯。

答案 1 :(得分:3)

变量被封装在一个类中以阻止它们的名称冲突。这些可以是公共的或私人的。有时需要确保仅使用设置变量的函数更改变量。例如,需要验证日期的某些部分,以阻止某人设置无效日期,例如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));
    };
})();

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

答案 2 :(得分:0)

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

例如:

班级Victim

  • 私有方法hasAnxiety()
  • public property appearToBeRich:Boolean

班级Robber

  • 私人方法资料(obj:受害者)
  • 私人方法抢劫(obj:受害者)

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

当然,现实世界的例子比我的例子更复杂 LOT (我希望它们更加优雅)。无论如何,我希望有所帮助。