首先,抱歉我缺乏术语。
如果我有构造函数
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()
方法。
答案 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);
});