JavaScript:原型函数中的私有变量

时间:2013-08-01 15:20:46

标签: javascript prototype

我正在使用原型函数,因为当“类”被多次实例化时,它们应该具有更好的性能。此外,并非外部都可以访问所有变量,因此它们是通过var在“类”中定义的,因此在闭包空间之外的任何地方都无法访问它们。

现在我有了这个简单的例子,我定义了一个“私有”变量并为它定义了set和get函数。

示例:

function Test() {
    var hello = "org";

    this._get = function (value) {
          hello = value;
    }
    this._set = function (value) {            
         return hello;            
    }
}


var test = new Test();
console.log(test._get());
test._set("new");
console.log(test._get());

Fiddler:http://jsfiddle.net/LdwuS/

现在我想对原型做同样的事情,但get函数总是返回undefined!

示例:

function Test() {
    var hello = "org";
}

Test.prototype.set = function (value) {
    return hello;
}
Test.prototype.get = function (value) {
    hello = value;
}

var test = new Test();
console.log(test.get());
test.set("new");

Fiddler:http://jsfiddle.net/rK22m/

我做错了什么或者这不可能?     的console.log(test.get());

3 个答案:

答案 0 :(得分:4)

与原型对象关联的函数与任何其他函数具有完全相同的对象访问权限。此外,与其他函数一样,它们具有 no 访问构造函数中存在的局部变量的权限。

答案 1 :(得分:1)

不幸的是,你根本无法做到你想要实现的目标,因为在JavaScript中创建可以访问私有变量的公共函数的唯一方法是在与私有变量相同的范围内声明函数,以便函数创建一个关闭这些,然后公开公开这些功能。

您必须做出选择,要么牺牲使用原型的好处,要么牺牲强制隐私。一种广泛采用的解决方案是依靠文档来识别私有属性,或者使用像_这样的字符作为前缀。但是,您总是可以将某些功能完全保密。

var MyClass = (function () {
    function MyClass() {
        //private
        this._private = 'private';
        this.public = 'public';

        //call privateFunction in the context of the current instance
        privateFunction.call(this);
    }

    //public functions
    MyClass.prototype.publicFunction = function () {
    };

    //private function
    function privateFunction () {
    }

    return MyClass;

})();

答案 2 :(得分:-2)

http://jsfiddle.net/uy38G/

这样做是有效的

function Test(){
    var hello = "org";   

    this.getHello = function(){
        return hello;
    }

    this.setHello = function(value){
        return hello = value;
    }
}

var test = new Test();

console.log(test.getHello());
test.setHello('new org');
console.log(test.getHello());