gpt4 book ai didi

javascript - 创建可以访问闭包的装饰器

转载 作者:行者123 更新时间:2023-12-03 08:26:23 25 4
gpt4 key购买 nike

我有很多小对象,它们都需要完成非常相似的任务,我想使用装饰器来修改这些对象,因为这使事情对我来说更容易。问题是,我还需要在访问这些对象上的某些数据时立即触发某些内容,同时防止外部访问实际数据。因此,我使用闭包来存储私有(private)数据并为外部访问提供神奇的更改器(mutator)。最后,我也没有特定原因使用构造函数。

这是该对象的一个​​非常简化的版本,以及让我头疼的部分:

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)时应该表现得与其他对象不同。所以,我想,我只需覆盖更改器(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 转储了只能在我传递新变量后才能从旧变量访问的闭包。有什么办法可以解决这个问题吗?

最佳答案

您可以使用 Object.getOwnPropertyDescriptor 访问有权访问 hiddenState 的闭包。另外,如果您不需要修改 getter,则根本不要覆盖它,它将持续存在。

var oldSetter = Object.getOwnPropertyDescriptor(o, 'state').set;
Object.defineProperty(o, 'state', {
set: function (s) {
/* do something to s */
oldSetter(s);
}
});

关于javascript - 创建可以访问闭包的装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33528091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com