【发布时间】:2011-08-13 16:11:20
【问题描述】:
它们有什么用,我们如何制作?可以举个例子吗?
【问题讨论】:
-
你叫什么私有变量?你为什么要问这个问题?请描述得更详细一点。
标签: javascript private-members
它们有什么用,我们如何制作?可以举个例子吗?
【问题讨论】:
标签: javascript private-members
例如,为了避免与多个库发生冲突。
假设他们都使用了一个常用的变量,例如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 月 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 函数。这存储了以前计算的值,并且阻止它们被操纵是私有的。
【讨论】:
我相信命名空间有多个原因。我理解的一种方式是:private、protected 和 public 表达式在团队环境中很有帮助,因此其他开发人员最终不会使用方法 你不打算让他们这样做。话虽如此,当方法或属性只需要由同一个对象访问时,您只使用private。当您需要继承类来承载相同功能时使用protected,当不同类的对象需要访问您的对象时使用public。
例如:
Victim 类有
类Robber有
Robber->profile() 需要访问 Victim->appearsToBeRich。如果Victim->appearsToBeRich 返回true,那么Victim 对象将被抢劫。 Robber 对象永远不需要运行 Victim->haveAnxiety,因为一旦 Victim 对象开始被抢劫,Victim 就会运行 this->haveAnxiety()。
诚然,现实世界的示例比我的示例复杂得多(我希望它们更优雅)。无论如何,我希望这会有所帮助。
【讨论】: