好的,所以我想在javascript中创建一个构造函数,它将计算使用这个构造函数创建的实例总数。
var Component = function(name) {
this.name = name;
this.add = function(){this.prototype.countInstances++;};
this.add();
};
和
Component.prototype.countInstances=0;
正如我所理解的那样,countInstances变量被添加到原型中,并且将作为所有实例的静态副本,并将充当我的计数器。
这段代码的问题在于,因为我在构造函数之后声明了countInstances,所以我在构造函数代码中得到了一个错误。如何纠正这个??
答案 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
通过在函数体内启动计数器,我们将能够保留计数(函数被调用的次数)。