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 関数は常に未定義を返します!

例:

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/

私は何か間違ったことをしていますか、それとも不可能ですか? console.log(test.get());

4

3 に答える 3

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 に答える