在javascript中查找某个原型的实例数

时间:2015-03-01 20:08:34

标签: 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的函数,因为有2个foo实例:f和c?

3 个答案:

答案 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并制作了一些新的对象添加到计数中。我不得不稍微修改一下。希望这现在有意义。

enter image description here