按照我的正确理解,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) 或__proto__ 属性(这将是下一个规范中基于浏览器的 JavaScript 的标准)访问它。
但把它放在原型上可能没有意义。我只是在函数本身上使用一个属性:
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;