Javascript:实现100%防篡改私有变量的方法?
我在读克罗克福德的教程。 私有变量由构造函数内的函数实现,该构造函数使私有变量与闭包相关联成为可能 通常javascript库是开放的,因此任何人都可以通过实例/对象修改构造函数的内部函数来查看和修改私有变量。这样地: c1.radius=函数(){return 500;} 更准确地说:在真正的OOPS中,没有人可以通过对象修改私有变量,但在这里我们可以 有谁能告诉我如何使它像JAVA或C一样完全防篡改Javascript:实现100%防篡改私有变量的方法?,javascript,Javascript,我在读克罗克福德的教程。 私有变量由构造函数内的函数实现,该构造函数使私有变量与闭包相关联成为可能 通常javascript库是开放的,因此任何人都可以通过实例/对象修改构造函数的内部函数来查看和修改私有变量。这样地: c1.radius=函数(){return 500;} 更准确地说:在真正的OOPS中,没有人可以通过对象修改私有变量,但在这里我们可以 有谁能告诉我如何使它像JAVA或C一样完全防篡改 function Circle(radius) { this.radius = funct
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;};
这个怎么样
function oTest(){
var a; // "private"
this.b; // "public"
this.get_a = function(){
return a
)
}
var aTest = new oTest();
aTest.private_get = function(){
return a
}
aTest.private_get() // ReferenceError: a is not defined
aTest.get_a() // works
我不确定我是否完全理解您的问题,但a仅适用于提供的原始方法集。这是怎么回事
function oTest(){
var a; // "private"
this.b; // "public"
this.get_a = function(){
return a
)
}
var aTest = new oTest();
aTest.private_get = function(){
return a
}
aTest.private_get() // ReferenceError: a is not defined
aTest.get_a() // works
我不确定我是否完全理解您的问题,但a仅适用于提供的原始方法集。首先,不要太担心如何使其防篡改。如果有人真的想要,他们将能够访问他们想要的 第二,除非您使用ECMAScript 5(IE9+、Safari 5+、Chrome 7+、FF 4+),否则无法真正做到这一点。如果您使用的是ES5浏览器,则可以使用该方法或使用:
注意:当使用
对象.create
或对象.defineProperty
时,属性默认为不可写、不可配置(不能更改类型,也不能删除属性)和不可枚举(不会显示在for(obj中的var x)
构造中)。首先,不要太担心使其防篡改。如果有人真的想要,他们将能够访问他们想要的
第二,除非您使用ECMAScript 5(IE9+、Safari 5+、Chrome 7+、FF 4+),否则无法真正做到这一点。如果您使用的是ES5浏览器,则可以使用该方法或使用:
注意:当使用对象.create
或对象.defineProperty
时,默认情况下属性是不可写的、不可配置的(不能更改类型,也不能删除属性)和不可枚举的(不会在for(obj中的var x)
构造中显示)。您可能需要查看。在下面的示例中,半径和面积是不可变的或防篡改的
function TCircle(radius) {
return Trait.create(
Object.prototype,
Trait({
radius: radius,
area: function() {
return (Math.PI) * (Math.pow(this.radius, 2));
}
}));
}
var circle = TCircle(5);
console.log(circle.area()); // 78.53981633974483
circle.radius = null;
console.log(circle.area()); // 78.53981633974483
circle.radius = 99;
console.log(circle.area()); // 78.53981633974483
如果你想要一个可变的对象,那么你可以使用object.create
而不是上面的Trait.create
。你可能想看看。在下面的示例中,半径和面积是不可变的或防篡改的
function TCircle(radius) {
return Trait.create(
Object.prototype,
Trait({
radius: radius,
area: function() {
return (Math.PI) * (Math.pow(this.radius, 2));
}
}));
}
var circle = TCircle(5);
console.log(circle.area()); // 78.53981633974483
circle.radius = null;
console.log(circle.area()); // 78.53981633974483
circle.radius = 99;
console.log(circle.area()); // 78.53981633974483
如果你想要一个可变对象,那么你可以使用
object.create
而不是上面的Trait.create
。任何人都可以修改他们有权访问的任何对象。任何需要私有的东西都应该存储在服务器上(甚至可以拦截AJAX调用)。我不偏向java或c,就像JAVA一样防篡改…:看,没有什么是防篡改的。如果因为有人找到了绕过设计的方法(我们谈论的是封装,而不是安全性,就像这里的数据安全性一样),而导致某些东西出现故障,那么这是他们的错误,而不是设计的错误。(顺便说一句,C语言中会有私有变量吗?)Crockford在你参考的文章中描述如何生成私有变量有什么不对?他们是私人的。只有在构造函数中定义的Methodo才能修改它们。外部代码无法修改它们。即使您自己在别处定义的代码也不能修改它们。任何人都可以修改他们有权访问的任何对象。任何需要私有化的东西可能都应该存储在服务器上(即使这样,您也可以拦截AJAX调用)。我不偏向java或c,只是问像java这样的防篡改…:看,没有什么是防篡改的。如果因为有人找到了绕过设计的方法(我们谈论的是封装,而不是安全性,就像这里的数据安全性一样),而导致某些东西出现故障,那么这是他们的错误,而不是设计的错误。(顺便说一句,C语言中会有私有变量吗?)Crockford在你参考的文章中描述如何生成私有变量有什么不对?他们是私人的。只有在构造函数中定义的Methodo才能修改它们。外部代码无法修改它们。即使您自己在别处定义的代码也不能修改它们。