使用原型访问局部变量

时间:2012-06-14 21:44:26

标签: javascript

我有一个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

2 个答案:

答案 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的一个属性,而不是函数体中的私有范围变量。