【发布时间】:2011-11-30 17:46:52
【问题描述】:
我正在阅读 Crockford 的教程 http://javascript.crockford.com/private.html。 私有变量由构造函数内部的函数实现,这使得私有变量与闭包相关联成为可能。
通常javascript库是开放的,所以任何人都可以通过实例/对象修改构造函数的内部函数来查看和修改私有变量。像这样: c1.radius = function (){return 500;};
更准确地说:在真正的 OOPS 中,没有人可以通过对象修改私有变量,但我们可以。
谁能给我建议如何让它像 JAVA 或 C 一样完全防篡改?
function Circle(radius) {
this.radius = function(){ return radius;}
}
Circle.prototype = {
constructor: Circle,
area: function(){
return (Math.PI)* (Math.pow(this.radius(),2));
}
};
c1 = new Circle(5);
console.log(c1.radius());
console.log(c1.area());
c1.radius = function (){return 500;};
【问题讨论】:
-
任何人都可以修改他们有权访问的任何对象。
-
任何需要 私有的东西都应该存储在服务器上(即使这样你也可以拦截 AJAX 调用)。
-
我不偏向java或者c,只是问问
-
像 JAVA 这样的防篡改...:见stackoverflow.com/questions/1555658/… 没有什么是防篡改。如果由于有人找到了规避设计的方法而出现问题(我们讨论的是封装,而不是安全,如数据安全这里),那么这是他们的错误,而不是设计的错误。 (顺便说一句,C 中可以有 私有变量 吗?)
-
你参考的文章中Crockford关于如何制作私有变量的描述有什么问题?他们是私人的。只有您在构造函数中定义的方法才能修改它们。外部代码无法修改它们。即使您自己在别处定义的代码也无法修改它们。
标签: javascript