0

インスタンス化されたインスタンスの数を追跡する「クラス」をJSに設定しようとしています。私はこのようにそうしようとしています...

var myNamespace = {};

myNamespace.myClass = function () {
    //fails here as .getNetInstanceNo() not recognised...
    var instanceNumber = myNamespace.myClass.getNextInstanceNo();

    return {
        instanceNo : function() { return instanceNumber; }        
    }        
};

myNamespace.myClass.InstanceNo = 0; //static property?

//should the class itself have this method added to it...
myNamespace.myClass.prototype.getNextInstanceNo = function () { //static method?
  return myNamespace.myClass.InstanceNo++;  
};

var class1 = new myNamespace.myClass();

alert('class 1 has instance of ' + class1.instanceNo() );

ただし、getNextInstanceNo関数が認識されないため、これは失敗します。を介して追加していると思いますがmyClass.prototype

私は何が間違っているのですか?

4

1 に答える 1

4

prototypeオブジェクトのインスタンスを作成し、そのオブジェクトにプロパティ/メソッドがない場合のように、他のオブジェクトがプロパティを継承するオブジェクトです。呼び出されると、オブジェクトが属するクラスのプロトタイプが検索されます。プロパティ/メソッド、ここに簡単な例があります:

function Animal(){};
Animal.prototype.Breathe = true;

var kitty= new Animal();
kitty.Breathe; // true (the prototype of kitty breathes)

var deadCat = new Animal();
deadCat.Breathe = false;
deadCat.Breathe; // false (the deadCat itself doesn't breath, even though the prototype does have breath

あなた自身が言ったように、プロトタイプでgetNextInstanceNoを定義する必要はありません。これは、JavaScriptで静的メソッドを定義する方法ではないため、クラス自体にそのまま残します。代わりに、instanceNoプロトタイプでメソッドを定義できます。方法は次のとおりです。

var myNamespace = {};

myNamespace.myClass = function () {
    this.instanceNumber = myNamespace.myClass.getNextInstanceNo();
};

myNamespace.myClass.prototype.instanceNo = function () {
    return this.instanceNumber;
};

myNamespace.myClass.InstanceNo = 0; 

myNamespace.myClass.getNextInstanceNo = function () { 
    return myNamespace.myClass.InstanceNo++;
};

var class1 = new myNamespace.myClass();

alert('class 1 has instance of ' + class1.instanceNo());
于 2012-04-21T18:05:34.360 に答える