我在构造函数的原型上创建了一个可枚举的属性:
// 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
我需要foo
在c
上显示为可枚举的属性。我无法控制构造函数C
。有没有办法实现这个目标?
我考虑过将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;
}
}
});
这应该可行(我还没有对它进行测试),但它看起来真的很糟糕。但是,我无法想到任何其他事情,所以我对我可能没有考虑的边缘案例的意见/观察感兴趣。
有没有办法找出构造函数何时运行?然后我可以捎带并在构造函数创建实例后附加我的属性。就像我说的那样,我无法改变实际的构造函数,并且通常idiom using call不会工作,因为构造函数在内部用于在我控制之外的地方创建实例。