循环遍历构造函数中的每个新对象
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()
方法。
不使用数组是不行的,这不是它应有的使用方式。
不过,您可以做的是监视在 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);
});
首先,很抱歉我的术语不够用。
如果我有构造函数
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()
方法。
不使用数组是不行的,这不是它应有的使用方式。
不过,您可以做的是监视在 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);
});