如何列出 OOP 中的所有对象

How to list all objects in OOP

不确定如何表达这个问题,但基本上,我有一个对象构造函数:

function myObject(name, type, size) {
    this.name = name;
    this.type = type;
    this.size = size; 
}

然后我创建所有对象(如果我继续这个宠物项目,可能会有数百个)

var newObject1 = new myObject("test name", "test type", "test size");
var newObject2 = new myObject("foo name", "foo type", "foo size");
var newObject3 = new myObject("bar name", "bar type", "bar size");
//etc.

现在,是否有一个循环允许我遍历来自 myObject 构造函数的每个对象?我试过使用这个:

console.log(Object.getOwnPropertyNames(myObject));

但我当然不知道如何遍历每个对象。有办法吗?

存储对每个对象的引用,然后打印该集合。

var myObjects = [];
function myObject(name, type, size) {
  this.name = name;
  this.type = type;
  this.size = size;
  myObjects.push(this);
}

// A bunch of new myObject()...

console.log(myObjects);

Javascript 运行时不提供任何工具来迭代特定类型的所有对象。如果您确实需要这样做,那么您将不得不在某种数据结构(可能是数组)中跟踪所有此类对象。

事实上,如果您要创建数百个对象,所有这些对象都具有唯一命名的变量,那么这就是一个危险信号,您可能应该编写代码以使用这些对象的数组并通过数组索引访问它们而不是每个都由唯一命名的变量。这也将使您的代码更加紧凑。


虽然它有时在 Javascript 中不受欢迎(因为它会破坏单个实例的垃圾收集,直到它们从数组中删除),您也可以让对象只跟踪它自己的对象列表通过让构造函数将每个新创建的对象添加到列表中。

function myObject(name, type, size) {
    this.name = name;
    this.type = type;
    this.size = size; 
    myObject.list.push(this);
}

myObject.list = [];

// to iterate all myObject instances
for (var i = 0; i < myObject.list.length; i++) {
    // myObject.list[i]
}

注意:您还可以保留创建未放入列表中的对象的能力,而只是创建一个创建对象并将其放入列表中的工厂函数:

function myObject(name, type, size) {
    this.name = name;
    this.type = type;
    this.size = size; 
}

var listOfMyObject = [];

function makeMyObject(name, type, size) {
    var o = new myObject(name, type,size);
    listOfMyObject.push(o);
    return o;
}

// to iterate all myObject instances
for (var i = 0; i < listOfMyObject.length; i++) {
    // listOfMyObject[i]
}