Javascript构造函数来计算实例数

时间:2015-06-05 06:31:48

标签: javascript object constructor count

好的,所以我想在javascript中创建一个构造函数,它将计算使用这个构造函数创建的实例总数。

var Component = function(name) {
    this.name = name;
    this.add = function(){this.prototype.countInstances++;};
    this.add();
};

Component.prototype.countInstances=0;

正如我所理解的那样,countInstances变量被添加到原型中,并且将作为所有实例的静态副本,并将充当我的计数器。

这段代码的问题在于,因为我在构造函数之后声明了countInstances,所以我在构造函数代码中得到了一个错误。如何纠正这个??

4 个答案:

答案 0 :(得分:5)

如果你想要一个属性附加到类本身,而不是类的实例,你不想将属性添加到原型中:

var Component = function(name) {
  this.name = name;
  Component.instanceCount++;
};

Component.instanceCount = 0;

这样,您可以将每个名称分配给其实例,并将总实例数分配给静态类:

var foo = new Component('bar');
var baz = new Component('qux');

console.info(foo.name, baz.name, Component.instanceCount);

>> 'bar', 'qux', 2

答案 1 :(得分:3)

  

正如我所理解的那样,countInstances变量被添加到原型中,并且将作为所有实例的静态副本,并将充当我的计数器。

不,它实际上是实例的默认值,而不是“静态”。如果你把它放在Component.prototype上,所有实例都将通过原型链继承它,但是通过实例更改它将为该实例提供它的自己的副本。例如:

var Foo = function() {
};
Foo.prototype.bar = 0;
var f1 = new Foo();
var f2 = new Foo();
console.log(f1.bar, f2.bar); // 0, 0 -- both are still using the `bar` on the prototype
++f1.bar;
console.log(f1.bar, f2.bar); // 1, 0 -- f1 now has its own
Foo.prototype.bar += 2;
console.log(f1.bar, f2.bar); // 1, 2 -- f2 is still using the `bar` on the prototype
  

这段代码的问题在于,因为我在构造函数之后声明了countInstances,所以我在构造函数代码中遇到错误。如何纠正这个??

不,问题是您的实例没有this.prototype个对象。函数上的prototype属性不会复制为实例上的prototype属性;它被分配给他们作为他们的原型,(有点令人困惑)不称为prototype。很长一段时间,它根本没有超出规格的名称。您可以通过Object.getPrototypeOf(this)或(这将是下一个规范中基于浏览器的JavaScript的标准)__proto__属性来访问它。

但是把它放在原型上可能没有意义。我只是在函数本身上使用一个属性:

var Component = function(name) {
    this.name = name;
    this.add = function(){Component.instances++;};
    this.add();
};
Component.instances = 0;

但是你说你想要计算构造函数创建的对象数量;以上计算调用add方法的次数。要计算构造函数创建的实例数,请在构造函数中增加它:

var Component = function(name) {
    Component.instances++;
    this.name = name;
    this.add = function(){/*Presumably you're doing something here*/};
    this.add();
};
Component.instances = 0;

答案 2 :(得分:0)

var ComponentCounter = 0;

var Component = function(name) {
    this.name = name;
    this.add = function(){this.prototype.countInstances++;};
    this.add();
    ComponentCounter++;
    // or Component.counter++;
};

// or add it as a property of Component after it has been defined
// Component.counter = 0;

原型中的变量属于实例,因此您必须跟踪实例之间持久存储的变量上的数据。

答案 3 :(得分:0)

我们将能够使用以下方法进行操作:

SET

通过在函数体内启动计数器,我们将能够保留计数(函数被调用的次数)。