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

Javascript 循环遍历构造函数中的每个新对象,javascript,javascript-objects,Javascript,Javascript Objects,首先,很抱歉我没有术语 如果我有一个构造函数 function myObject(name, value){ this.name = name; this.value = value; } 我用它做了一些东西 var One = new myObject("One", 1); var Two = new myObject("Two", 2); 我是否可以循环使用由myObject类生成的每个新对象,而不将每个新对象放入数组 是否可以向构造函数添加一个即时调用函数,将对象添加

首先,很抱歉我没有术语

如果我有一个构造函数

function myObject(name, value){
    this.name = name;
    this.value = value;
}
我用它做了一些东西

var One = new myObject("One", 1);
var Two = new myObject("Two", 2);
我是否可以循环使用由
myObject
类生成的每个新对象,而不将每个新对象放入数组


是否可以向构造函数添加一个即时调用函数,将对象添加到数组中

e、 g

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

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


一年后回到这里,我可以告诉你这是可能的。您只需在构造函数中调用函数,如下所示:

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

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

    this.addToArray();

}
下面是JSFIDLE中的一个例子,在实例化时将每个对象推入一个数组,然后直接从数组调用每个对象的
.speak()
方法


如果不使用数组,则无法使用,因为这不是使用数组的方式

不过,您可以监视在
myObject
类的静态成员中创建的每个实例

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 = [];

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

在构造函数中,您可以将创建的每个对象的引用存储到数组/映射中,以便随时对它们进行迭代。但是,这会阻止此类的所有对象被垃圾收集,因此请小心使用


JavaScript中的
WeakMap
只保留一周的键引用,但它不允许您循环所有键。所以它也不是一个选项。

是Object.keys(一);你需要什么?你不能,没有任何东西可以保留对你的对象的引用。基本上,我希望能够看到我从myObject构造函数创建的每个对象。它们的可能副本不会存在于窗口中的某个位置。?@JoshStevenson only globals。查看我的编辑,这样可以吗?我觉得这应该是一件容易实现的事情,但事实证明并非如此@Josh Stevenson您对iLife的编辑是多余的,基本上与直接执行数组相同。按(此),再加上
此。addToArray
将是
未定义的,因为您不会从iLife返回任何内容。我知道。这就是为什么我说“显然,当前语法不起作用”如果你真的决定要这样做,那么你可以保留一个WeakMap键数组并在其上循环。然后这个额外的数组将保留对象,这就违背了WeakMap
的全部目的。我之所以提到
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);
});
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);
});