0

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

4

2 回答 2

0

这是不可能的,因为一个对象不知道其他对象从它继承了什么。这是一个单向关系(从对象/实例到原型)。

并非所有对象都可以通过递归访问window。您无权访问函数中的局部变量。

您必须手动跟踪创建的实例。

于 2013-02-25T11:51:27.573 回答
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
于 2013-02-25T18:12:31.420 回答