如何找到某个原型的实例数?例如,我在javascript中定义了这样的原型:
var foo = function(config) {
this.x = config.x;
...
}
foo.prototype.update = function() {
...
}
var f = new foo(...);
var c = new foo(...);
...
我怎样才能使它有一个返回2的函数,因为有2个foo实例:f和c?
答案 0 :(得分:1)
充分利用面向对象的编程。
请参阅此示例PLNKR
您可以像foo
一样创建父类:
function Bar() {
this.foobars = [];
console.log('new Bar',this.foobars);
}
Bar.prototype.add = function(foo) {
console.log("Pushing");
this.foobars.push(foo);
console.log(this.foobars);
}
Bar.prototype.size = function(foo) {
return this.foobars.length;
}
function Foo(config) {
this.x = config.x;
this.add(this);
console.log('new Foo', Foo.prototype.foobars);
}
Foo.prototype = new Bar();
var f = new Foo({x:1});
var c = new Foo({x:2});
console.log("f.x:",f.x,"c.x:",c.x,"Foos: ",f.size());
并且每个Foo实例都可以访问Bar中的整个Foos数组。如果您愿意,也可以简单地使用计数而不是数组。
此代码运行时,这是控制台输出:
new Bar []
Pushing
[Foo]
new Foo [Foo]
Pushing
[Foo, Foo]
new Foo [Foo, Foo]
最终的控制台输出将是:
f.x: 1 c.x: 2 Foos: 2
答案 1 :(得分:1)
如果您正在编写纯JavaScript,而不是实际的处理代码,只需在JavaScript中使用原型概念:
// objects conventionally use CamelCase
var Foo = function(config) {
this.instantiated();
...
};
var fooPrototype = {
instances: 0,
instantiated: function() {
FooPrototype.instances++;
},
update: function() {
...
},
...
};
Foo.prototype = fooPrototype;
var f = new Foo();
console.log(f.instances); // -> "1"
var c = new Foo();
console.log(c.instances); // -> "2"
因为对象永远不会创建一个本地instance
变量,遮蔽原型值,所以每次修改都会修改原型变量,其中只有一个变量。
另一方面,如果你使用的是真正的处理,你只需创建一个静态类变量并在构造函数调用期间递增它。
class Thing {
static int instances = 0;
Thing() {
Thing.instances++;
}
int getInstanceCount() {
return Thing.instances;
}
}
答案 2 :(得分:-1)
你可以试试这个
var counter = 0;
for (prop in foo.prototype) {
console.dir(prop);
counter++;
}
console.log('total prototypes in foo: '+counter);
<强>更新强> 我想你想搜索foo的实例?
f instanceof foo
假设
var foo = function(config) {
this.x = config.x;
}
var config = new Object();
config.x = "1";
var f = new foo(config);
然后
f instanceof foo
true
那么如果你想在全局范围内找到foo的所有实例......
var counter = 0; //set the counter to zero
for (name in window) { //for property in global scope iteration
if (window[name] instanceof foo) { // if property is an instance of foo then count it
counter++;
}
}
console.log('total instances of foo '+counter); //total count
我只是尝试了这个并将foo交换为Object并制作了一些新的对象添加到计数中。我不得不稍微修改一下。希望这现在有意义。