7

何度作成しても変わらないプライベートな静的 JavaScript 変数 (および関数) を作成する正しい方法はありますか?new Obj

これは私が試したもので、うまくいくようです

var ObjClass = (function(){

    var static_var = 0; //private static variable
    var static_fn = function(){ return static_var; }; //private static function

    return function(){
        ++static_var;
        var thisNumber = static_var;
        this.getThisNumber = function(){
             return thisNumber;
        }
        this.getStaticNumber = static_fn; //making static fn public
    }

})();

var obj1 = new ObjClass;
var obj2 = new ObjClass;
var obj3 = new ObjClass;

console.log(obj1.getThisNumber()); //output `1`
console.log(obj1.getStaticNumber()); //output `3`
console.log(obj2.getThisNumber()); //output `2`
console.log(obj2.getStaticNumber()); //output `3`
console.log(obj3.getThisNumber()); //output `3`
console.log(obj3.getStaticNumber()); //output `3`​

デモ

それとも他に 良い方法がありますか?

4

2 に答える 2

6

はい、それがプライベートな静的変数を作成する正しいアプローチです。

しかし、私は別のものを扱いstatic_fnます。公開してほしいそうです。

  1. プライベートインスタンス変数と相互作用しないため、「クラス」のプロトタイプにある必要があります
  2. インスタンスとはまったくやり取りしません。通常のアプローチは、そのような関数/変数を「クラス」自体、つまり JS のコンストラクターに配置することです。コンストラクターはFunctionオブジェクトであるため、他の js オブジェクトと同様にプロパティで拡張できます。
var ObjClass = (function closure(){

    var static_var = 0; //static private (scoped) variable
    function static_fn(){ return static_var; }; //static private (scoped) function

    function ObjClass() {
        var thisNumber = ++static_var; // private instance variable
        this.getThisNumber = function() { // public instance method
            return thisNumber; // "privileged" to access scoped instance variables
        };
    }
    ObjClass.getStaticNumber = static_fn; // make the static_fn public
    return ObjClass;
})();



var obj1 = new ObjClass;
var obj2 = new ObjClass;
console.log(ObjClass.getStaticNumber()); //output `2`
var obj3 = new ObjClass;
console.log(ObjClass.getStaticNumber()); //output `3`

console.log(obj1.getThisNumber()); //output `1`
console.log(obj2.getThisNumber()); //output `2`
console.log(obj3.getThisNumber()); //output `3`
于 2012-05-31T13:19:32.647 に答える
1

私は以前、静的変数を作成するためにこの簡単な方法を使用しましたが、それらは非公開です。

function MyClass() {

    var static = this.constructor.static = this.constructor.static || {
        var1: defValue,
        ...
    }

    static.var1 = ... ;
}

つまり、静的変数をクラスのプライマリ コンストラクター関数のプロパティとして格納するだけです。

于 2012-05-31T13:42:16.873 に答える