从Constructor循环遍历每个新Object

时间:2015-07-02 09:11:57

标签: 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类创建的每个新对象,而无需将每个新对象放入数组中?

是否可以将Instantly调用函数添加到将Object添加到数组中的构造函数中?

e.g。

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/

3 个答案:

答案 0 :(得分:1)

不使用数组,你不能,它不是它的使用方式。

您可以做的是监视在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 = [];

答案 1 :(得分:1)

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

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

JavaScript中的WeakMap只保留一周对密钥的引用,但反过来,它不允许循环遍历所有密钥。所以它也不是一种选择。

答案 2 :(得分:0)

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);
});