在javascript中查找某个原型的实例数
如何找到某个原型的实例数?例如,我在javascript中定义了这样一个原型:在javascript中查找某个原型的实例数,javascript,prototype,instance,Javascript,Prototype,Instance,如何找到某个原型的实例数?例如,我在javascript中定义了这样一个原型: var foo = function(config) { this.x = config.x; ... } foo.prototype.update = function() { ... } var f = new foo(...); var c = new foo(...); ... 我怎样才能使函数返回2,因为有两个foo:f和c的实例?你可以试试这个 var counter = 0;
var foo = function(config) {
this.x = config.x;
...
}
foo.prototype.update = function() {
...
}
var f = new foo(...);
var c = new foo(...);
...
我怎样才能使函数返回2,因为有两个foo:f和c的实例?你可以试试这个
var counter = 0;
for (prop in foo.prototype) {
console.dir(prop);
counter++;
}
console.log('total prototypes in foo: '+counter);
更新
我想你想搜索foo的实例
f foo实例
假定
var foo = function(config) {
this.x = config.x;
}
var config = new Object();
config.x = "1";
var f = new foo(config);
然后
所以如果你想在全局范围内找到所有的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,并创建了一些新的对象来增加计数。我不得不稍微修改一下。希望这现在是有意义的
充分利用面向对象编程 参见此示例 您可以创建
foo
的父类,如下所示:
功能条(){
this.foobars=[];
console.log('newbar',this.foobars);
}
Bar.prototype.add=函数(foo){
控制台日志(“推送”);
这个.foobars.push(foo);
console.log(this.foobars);
}
Bar.prototype.size=函数(foo){
返回this.foobars.length;
}
函数Foo(配置){
this.x=config.x;
这.加上(这),;
log('newfoo',Foo.prototype.foobars);
}
Foo.prototype=newbar();
var f=新的Foo({x:1});
var c=新的Foo({x:2});
log(“f.x:,f.x,“c.x:,c.x”,“Foos:,f.size());
每个Foo实例都可以访问Bar中的整个Foo数组。如果愿意,您也可以简单地使用计数而不是数组
运行此代码时,控制台输出如下:
new Bar []
Pushing
[Foo]
new Foo [Foo]
Pushing
[Foo, Foo]
new Foo [Foo, Foo]
最终控制台输出为:
f.x:1 c.x:2 Foos:2
如果您编写的是纯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"
由于对象从不创建局部实例变量,从而隐藏原型值,因此每次修改都会修改原型变量,而原型变量只有一个
另一方面,如果您使用的是实处理,则只需创建一个静态类变量,并在构造函数调用期间增加该变量
class Thing {
static int instances = 0;
Thing() {
Thing.instances++;
}
int getInstanceCount() {
return Thing.instances;
}
}
我不是要确定一个函数有多少原型,而是要确定有多少实例。那么“var someName=new foo();”有多少个呢?我试过了,它只返回config.x等于什么。这不是我真正想要的。所以我遇到的问题是在全局范围中使用了错误的对象。我想你想要窗户。当我运行for循环时,我可以从我的屏幕截图中验证每个新实例是否被计数。虽然这是可行的,但这并不是一种很好的方法来完成您试图完成的任务。当您可以跟踪每个实例时,为什么要反向搜索并在整个窗口中循环?看看我的答案,看看如何以一种面向对象的方式来做,而不使用for循环。这通常是个坏主意,因为你的伯爵不知道垃圾收集。使用额外的helper函数来创建相应更新计数的实例。从技术上讲,这个问题与Processing.js无关(我说的是Processing.js的dev=)。这是一个简单的JavaScript问题,关于JavaScript实例计数。@Mike'Pomax'Kamermans哦,好的。不客气,我很高兴它为你解决了。如果你对此有任何其他问题,请告诉我!请不要使用文档。请编写在一个示例中,这是一个相当危险的“根本不做你想做的事”函数,仍然纯粹出于历史原因console.log
仅用于查看“某物”,或创建DOM节点,然后为页面数据添加子节点,这会阻止人们“学习”使用文档。write@Mike“Pomax”Kamerman你说得对,谢谢你指出这一点。我这样做只是为了快速显示发生了什么,但我将其更改为console.log。
class Thing {
static int instances = 0;
Thing() {
Thing.instances++;
}
int getInstanceCount() {
return Thing.instances;
}
}