我正在寻找一种方法(最好不要构建它们被添加到的容器)来循环遍历JavaScript伪类的所有实例,而无需循环嵌套实例并循环遍历窗口对象的所有子节点。这是可能的,还是我没有办法,只是创建一个数组,保存我想要访问所有实例的任何伪类的所有实例?
答案 0 :(得分:0)
这是不可能的,因为一个对象不知道其他对象从它继承了什么。它是一种单向关系(从对象/实例到原型)。
并非通过递归window
可以访问所有对象。您无权访问函数中的局部变量。
您必须手动跟踪创建的实例。
答案 1 :(得分:0)
使用以下代码管理解决此问题(并且无需为继承链中的每个继承创建对象的虚拟实例):
Object.defineProperty(Object.prototype, 'constructing', {
enumerable: false,
writable: true,
value: false
});
Object.defineProperty(Object.prototype, 'construct', {
enumerable: false,
get: function () {
if ((this === Object) || (this.constructor === Object)) { return; }
if (this.constructing === false) {
this.constructing = this.__proto__.constructor;
}
if (this.constructing.hasOwnProperty('instances')) { this.constructing.instances.push(this); }
var c = this.constructing;
if ('base' in c) {
this.constructing = c.base;
this.constructing.call(this);
}
if (c !== this.__proto__.constructor) {
for (var i in c.prototype) {
if (!this.__proto__.hasOwnProperty(i)) { this.__proto__[i] = c.prototype[i]; }
}
}
}
});
function A() {
this.construct;
this.foo = 'foo';
}
function A_bar() { console.log(this.foo + 'foo'); }
A.prototype.constructor = A;
A.prototype.bar = A_bar;
A.instances = new Array();
function B() {
this.construct;
this.foo = 'bar';
var base = this.__proto__.constructor.base.prototype;
}
function B_bar() { console.log('bar'); }
B.base = A;
B.prototype.constructor = B;
B.prototype.bar = B_bar;
B.instances = new Array();
document.write(A.instances.length);
document.write(B.instances.length);
var a = new A();
document.write(a.foo);
document.write(A.instances.length);
document.write(B.instances.length);
var b = new B();
document.write(b.foo);
document.write(A.instances.length);
document.write(B.instances.length);
var c = new B();
document.write(c.foo);
document.write(A.instances.length);
document.write(B.instances.length);
a.bar();
b.bar();
c.bar();
输出:
00foo10bar21bar32