2011-08-13 34 views
1

它们是什么和我们如何做到这一点?你可以给我一个例子吗?例如,为了避免与多个库发生冲突,请使用以下命令:为什么我们需要私有变量?

+4

你在调用私有变量?你为什么问这个问题?请稍微描述一下。 –

回答

6

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

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

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函数。这存储了以前计算的值,并且它是私人的,以阻止它们被操纵。

0

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

例如:

Victim具有

  • 私有方法haveAnxiety()
  • 公共属性appearsToBeRich:布尔

类具有

  • 私有方法简介(OBJ:受害者)
  • 私有方法抢劫(OBJ:受害者)

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

当然,现实世界的例子是比我的例如LOT更复杂(我希望他们更优美)。无论如何,我希望这会有所帮助。

+3

我不确定这是否与JavaScript有关。 – pimvdb