[英]Javascript: way to implement 100% tamperproof private variables?
我正在阅读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;};
那这个呢?
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
我不确定我是否完全理解您的问题,但只有原始的一套方法可用。
第一关,不要太担心防篡改。 如果有人真的想要,他们将能够访问他们想要的东西。
2,除非您使用ECMAScript 5(IE9 +,Safari 5 +,Chrome 7 +,FF 4+),否则您无法真正做到这一点。 如果您使用的是ES5浏览器,则可以使用Object.defineProperty
方法或使用Object.create
:
function Circle(radius) {
Object.defineProperty(this, 'radius', {
value: radius
});
}
注意:使用Object.create
或Object.defineProperty
,属性默认为不可写,不可配置(类型不能更改且属性不能删除),且不可枚举(不会显示在for(var x in obj)
constructs)。
你可能想看看traits.js 。 在以下示例中,半径和区域是不可变的或防篡改的。
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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.