Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中查找某个原型的实例数_Javascript_Prototype_Instance - Fatal编程技术网

在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;

如何找到某个原型的实例数?例如,我在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;
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;
  }
}