是否可以迭代JavaScript伪类的所有实例?

时间:2013-02-25 10:53:27

标签: javascript iteration global pseudo-class

我正在寻找一种方法(最好不要构建它们被添加到的容器)来循环遍历JavaScript伪类的所有实例,而无需循环嵌套实例并循环遍历窗口对象的所有子节点。这是可能的,还是我没有办法,只是创建一个数组,保存我想要访问所有实例的任何伪类的所有实例?

2 个答案:

答案 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