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 回答