我正在阅读 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.create
或 Object.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/