循环遍历构造函数中的每个新对象

Loop through each new Object from Constructor

首先,很抱歉我的术语不够用。

如果我有构造函数

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

我用它做了一些东西

var One = new myObject("One", 1);
var Two = new myObject("Two", 2);

我可以循环遍历由 myObject class 生成的每个新对象,而不将每个新对象放入数组吗?


是否可以将即时调用函数添加到将对象添加到数组的构造函数中?

例如

function myObject(name, value){
    this.name = name;
    this.value = value;

    this.addToArray = function(){
        theArray.push(this);        // this is the IIFE
    }(); 
}

这样任何新对象都会立即创建 运行 这个函数并添加到数组中。

这可能吗? (显然,当前语法不起作用)


编辑 一年后回到这个话题,我可以告诉你这是可能的。您只需像这样在构造函数中调用函数:

function myObject(name, value){
    this.name = name;
    this.value = value;

    this.addToArray = function(){
        theArray.push(this);
    };

    this.addToArray();

}

这是 JSFIDDLE 中的一个示例,在实例化时将每个对象推入数组,然后直接从数组调用每个对象的 .speak() 方法。

https://jsfiddle.net/Panomosh/8bpmrso1/

不使用数组是不行的,这不是它应有的使用方式。

不过,您可以做的是监视在 myObject class

的静态成员中创建的每个实例
function myObject(name, value){
    this.name = name;
    this.value = value;

    this.watch();
}

myObject.prototype.watch = function () {
    if (myObject.instances.indexOf(this) === -1) {
        myObject.instances.push(this);
    }
};

myObject.prototype.unwatch = function () {
    myObject.instances.splice(myObject.instances.indexOf(this), 1);
};

myObject.instances = [];

不,你不能。几乎所有的编程语言都无法做到这一点。

您可以在构造函数中将您创建的每个对象的引用存储到 array/map 中,以便您可以随时迭代它们。但是,这会阻止此 class 的所有对象被垃圾回收,因此请谨慎使用。

JavaScript 中的 WeakMap 仅保留对键的一周引用,但反过来,它不允许您遍历所有键。所以这也不是一个选择。

var MyClass = (function() {
  var _instances = [];

  function MyClass(name, value) {
    _instances.push(this);

    this.name = name;
    this.value = value;
  }

  MyClass.each = function(cb) {
    for (var i in _instances) {
      if (_instances.hasOwnProperty(i)) {
        cb(_instances[i]);
      }
    }
  }

  return MyClass;

})();

new MyClass('John', 10);
new MyClass('James', 20);

MyClass.each(function(item) {
  console.log(item);
});