我有一个Class,它有一个带有public setter / getter函数的私有变量:
function Circle(rad) {
var r = rad;
this.radius = function(rad) {
if(!arguments.length) return r;
r = rad;
return this;
}
}
var shape = new Circle(10);
console.log( shape.radius() ); // 10
shape.r = 50;
console.log( shape.radius() ); // 10
如何使用Object.prototype
复制此内容?或者,我什么时候想要使用闭包而不是Object.prototype
?这是我能想到的最接近的,但正如您所看到的,您可以直接更改属性。
function Circle(r) {
this.r = r;
}
Circle.prototype.radius = function(r) {
if(!arguments.length) return this.r;
this.r = r;
return this;
};
var shape = new Circle(10);
console.log( shape.radius() ); // 10
shape.r = 50;
console.log( shape.radius() ); // 50
答案 0 :(得分:4)
如果您要使用原型来存储对象的属性,则可以从任何具有对象引用的代码访问它们。做你想做的事是不可能的。
许多JS开发人员所做的只是使用前导下划线命名私有属性,以便其他人知道不要弄乱它,但除了建议
使用基于闭包的方法的原因
使用原型的原因
读者:请根据您认为最佳解决方案的原因编辑答案。
答案 1 :(得分:0)
我发现你的第一个圈很奇怪。如果你像这样重写它:
function Circle(rad) {
var r = rad;
this.radius = function(rad) {
if(rad){r = rad;}
return r;
}
}
我认为它现在就是你的意思。 r是私有的,radius用作getter / setter函数。 像这样设置r:
shape.r = 50;
没有意义,因为你的第一个Circle没有属性r,它只有一个本地范围的变量r。它应该引发某种错误。
我无法在第二版Circle中看到使用原型的方法,因为原型链中的函数无法访问Circle对象中创建的变量。无论如何,在你的第二个版本中,r是Circle的一个属性,而不是函数体中的私有范围变量。