我有很多小对象都需要完成非常相似的任务,我想使用装饰器来修改这些对象,因为这让我的事情变得更容易。问题是,我还需要在访问这些对象上的某些数据时立即触发内容,同时防止外部访问实际数据。因此,我使用闭包来存储私有数据并为外部访问提供神奇的变异器。最后,我也无缘无故地使用了构造函数。
这是一个非常简化的对象版本和让我头疼的部分:
var Foo = function () {
var hiddenState;
return {
set state (s) {
// Do something that justifies using magical accessors
state = s;
},
get state () {
// Do something that justifies using magical accessors
return state;
}
}
};
var o = new Foo();
o.state = 10;
好的,现在有一些对象在使用它们的 mutator 时应该表现得与其他对象不同。所以,我想,我会覆盖突变器,就是这样:
// Let's suppose I have some reason to modify the magical accessors for some objects but not for others
Object.defineProperty(o, 'state', {
get: function () {return hiddenState /*...*/},
set: function (s) {state = s /*...*/}
});
o.state; // Ouch!
这行不通。我收到一个参考错误,因为我试图访问hiddenState
它没有在新的 getter/setter 对的范围内定义。
我怀疑 JS 会在我传入新的mutators 时转储只能从旧的mutators 访问的闭包。有没有办法解决这个问题?