在实例上枚举枚举的原型属性

时间:2016-06-20 14:12:38

标签: javascript

问题

我在构造函数的原型上创建了一个可枚举的属性:

// Definition of constructor function C is outside of my control
Object.defineProperty(C.prototype, 'foo', {
    enumerable: true,
    get: function() { /* Do something */ },
    set: function(_foo) { /* Do something */ }
}

显然,这不会出现在使用该构造函数创建的实例的可枚举属性中:

var c = new C();
Object.keys(c); // Does not include foo

我需要fooc上显示为可枚举的属性。我无法控制构造函数C。有没有办法实现这个目标?

可能性1

我考虑过将getter和setter代码转换为"属性生成"代码利用this在调用实例时引用实例的事实。所以我应该能够做到这一点:

function makeFoo(obj) {
    Object.defineProperty(obj, 'foo', {
        enumerable: true,
        get: function() { /* Actual getter for foo */ },
        set: function() { /* Actual setter for foo */ }
    });
}
Object.defineProperty(C.prototype, 'foo', {
    get: function() { if (!this.hasOwnProperty('foo') makeFoo(this); },
    set: function(_foo) { 
        if (!this.hasOwnProperty('foo') {
            makeFoo(this); 
            this.foo = _foo;
        }
    }
});

这应该可行(我还没有对它进行测试),但它看起来真的很糟糕。但是,我无法想到任何其他事情,所以我对我可能没有考虑的边缘案例的意见/观察感兴趣。

可能性2

有没有办法找出构造函数何时运行?然后我可以捎带并在构造函数创建实例后附加我的属性。就像我说的那样,我无法改变实际的构造函数,并且通常idiom using call不会工作,因为构造函数在内部用于在我控制之外的地方创建实例。

0 个答案:

没有答案