2011-09-05 16 views
35

次のコードでは、作成されたPersonオブジェクトの数を記録するカウンタを持っています。このコードはそうではありません。どうすれば達成できますか?Javascriptで静的変数を宣言する方法

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; 
+1

これはどのように実際に動作するか説明できますか? – nepsdotin

答えて

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

Person.counter = 0; 

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

むしろprototypeより、「静的」変数にPerson機能のプロパティを作成し、コンストラクタ内Personの代わりthisを使用しています。

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

ここには上記のコードのworking exampleがあります。

+2

3番目の答えが、最も完全な/正しい。 –

+0

'Person'の中にカウンタがある場合、' p1 'のようなintanceからどのように取得できますか? – Dims

+0

@Dimsコンストラクタへの参照から取得できます: 'p1.constructor.counter' –

5

静的なプロパティはありません。必要ならば、Person機能でデータを保存することができます。

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

スタティックでは、関数オブジェクト自体にプロパティを割り当てることができます。

Person.counter = 0; 

そして、

Person.counter += 1; 

また場合、未定義のチェックインとJSの静的クラス変数/プロパティのようなものはありません

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

コンストラクタ内Person.counterを作成することができます。最も単純なアプローチは、静的変数の名前空間として "class"関数を使用することです。

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

クロージャを使用することもできますが、実際には90%の場合は過剰です。 現代のブラウザでは、Person.countやその他の静的変数の使用をラップするためにgetter/setter関数を再定義することもできます。

このスニペットは考えを示しています

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); 
12

また、閉鎖にローカルとして、それを宣言し、「プライベート」あなたのカウンタ変数を作ることができます。 プライベート静的変数に似た何かを持つのが最善の方法です:

var Person = (function() { 

    var counter = 0; 

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


var p1 = new Person(); 
var p2 = new Person(); 
関連する問題