0

我正在使用原型函数,因为当“类”被多次实例化时,它们应该具有更好的性能。此外,并非所有变量都应该可供外部访问,因此它们是在“类”中定义的,因此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());

提琴手: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");

提琴手:http: //jsfiddle.net/rK22m/

我做错了什么还是不可能?控制台.log(test.get());

4

3 回答 3

4

与原型对象关联的函数对对象的访问与任何其他函数完全相同。此外,与其他函数一样,它们无法访问构造函数调用时存在的局部变量。

于 2013-08-01T15:22:27.283 回答
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;

})();
于 2013-08-01T15:35:02.313 回答
-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());
于 2013-08-01T15:33:49.333 回答