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

标签 javascript

我正在阅读 Crockford 的教程 http://javascript.crockford.com/private.html . 私有(private)变量由构造函数内部的函数实现,这使得将私有(private)变量关联到闭包成为可能。

通常 javascript 库是开放的,因此任何人都可以通过实例/对象修改构造函数的内部函数来查看和修改私有(private)变量。像这样: c1.radius = function (){return 500;};

更准确地说:在真正的 OOPS 中,没有人可以通过对象修改私有(private)变量,但在这里我们可以。

任何人都可以向我建议如何使它像 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;};

最佳答案

第一次,不要太担心让它防篡改。如果有人真的想要,他们将能够访问他们想要的东西。

第二,除非您使用 ECMAScript 5(IE9+、Safari 5+、Chrome 7+、FF 4+),否则您无法真正做到这一点。如果你使用的是 ES5 浏览器,你可以使用 Object.defineProperty 做你想做的事。方法,或使用 Object.create :

function Circle(radius) {
    Object.defineProperty(this, 'radius', {
        value: radius
    });
}

注意:当使用 Object.createObject.defineProperty 时,属性默认是不可写的,不可配置的(类型不能改变,属性可以't be deleted), and non-enumerable (won’t show up in for(var x in obj) constructs).

关于Javascript:实现 100% 防篡改私有(private)变量的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8330488/

相关文章:

javascript - 如何在 angularjs 中使用 Jquery $.Ajax

javascript - 添加网格线至 d3 中距 x 轴的线高

javascript - 取消订阅后再次激活observable

javascript - 使用 Angular 根据重复项的数量设置类?

c# - 在 ListView 中显示/隐藏 Div

javascript - 如何在 Vue 的输入表单中使用 selectize

javascript - 将 Https 重定向到 Http (Cpanel)

javascript - 如何在 HTML 元素中存储对象引用?

c# - 将 javascript 方法的功能转换为 C#

javascript - 从 android/iphone 中删除 url 搜索栏