web-dev-qa-db-ja.com

JavaScriptで静的変数を宣言する方法

次のコードでは、作成されたPersonオブジェクトの数を追跡するためのカウンターが必要です。このコードはそうしていませんが、どうすればそれを達成できますか?

function Person(){
    this.name = "Peter";
    this.counter = this.counter + 1;
    alert(this.counter);
}

Person.prototype.counter = 0;

var p1 = new Person;
var p2 = new Person;
36
indianwebdevil
function Person(){
    this.name = "Peter";
    Person.counter++;
    alert(Person.counter);
}

Person.counter = 0;

var p1 = new Person();
var p2 = new Person();

「静的」変数をPersonではなくprototype関数のプロパティにし、コンストラクター内でPersonの代わりにthisを使用します。

これが可能なのは、JavaScript関数がファーストクラス(つまり、オブジェクト)であり、独自のプロパティを持つことができるためです。

上記のコードの 実行例 を次に示します。

71
James Allardice

また、カウンター変数を「プライベート」にして、クロージャーに対してローカルとして宣言することもできます。プライベート-静的変数に似たものを作成するのに最適な方法です。

var Person = (function() {

    var counter = 0;

    return function() {
        counter++;
        this.name = "Peter";
        alert(counter);
    };
})();


var p1 = new Person();
var p2 = new Person();

例: https://jsfiddle.net/patodiblasi/67wucsqx/

12
Pato

静的プロパティはありません。必要に応じて、Person関数にデータを保存できます。

function Person(){
    this.name = "Peter";
    Person.counter++;
    alert(Person.counter);
}
6
Raynos

静的の場合、プロパティを関数オブジェクト自体に割り当てることができます。

Person.counter = 0;

そして、コンストラクタ内で次のように増分します。

Person.counter += 1;

未定義をチェックして、コンストラクター内でPerson.counterを作成することもできます

function Person(){
   if (typeof Person.counter === 'undefined')
      Person.counter = 0;
   else
      Person.counter += 1;
   ...
4
Alex K.

Jsには静的クラス変数/プロパティのようなものはありません。最も単純なアプローチは、静的変数の名前空間として「クラス」関数を使用することです。

つまり、Person.countに直接アクセスするだけです。

クロージャーも使用できますが、実際には90%の場合、過剰になります。最新のブラウザでは、getter/setter関数を再定義して、Person.countおよびその他の「静的」変数の使用をラップすることもできます。

このスニペットはアイデアを示しています。

    function borrow(obj, borrowobj, fname) {
    obj.__defineGetter__(fname, function() {
         return borrowobj[fname]   
    })  

    obj.__defineSetter__(fname, function(val) {
             borrowobj[fname] = val      
    })
}

function Person() {
    borrow(this, Person, "count");
    this.count++
}

Person.count = 0;

new Person();
new Person();
var p = new Person();
alert(p.count);
0
shabunc