Javascript:实现100%防篡改私有变量的方法?

Javascript:实现100%防篡改私有变量的方法?,javascript,Javascript,我在读克罗克福德的教程。 私有变量由构造函数内的函数实现,该构造函数使私有变量与闭包相关联成为可能 通常javascript库是开放的,因此任何人都可以通过实例/对象修改构造函数的内部函数来查看和修改私有变量。这样地: c1.radius=函数(){return 500;} 更准确地说:在真正的OOPS中,没有人可以通过对象修改私有变量,但在这里我们可以 有谁能告诉我如何使它像JAVA或C一样完全防篡改 function Circle(radius) { this.radius = funct

我在读克罗克福德的教程。 私有变量由构造函数内的函数实现,该构造函数使私有变量与闭包相关联成为可能

通常javascript库是开放的,因此任何人都可以通过实例/对象修改构造函数的内部函数来查看和修改私有变量。这样地: c1.radius=函数(){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;};
这个怎么样

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才能修改它们。外部代码无法修改它们。即使您自己在别处定义的代码也不能修改它们。