Javascript 如何为动态属性编写装饰器?

Javascript 如何为动态属性编写装饰器?,javascript,properties,decorator,Javascript,Properties,Decorator,我已经写了一篇文章,其中我必须写一些装饰器,这样我就可以钩住一些函数调用。然而,我也希望钩住属性setter调用,但我不确定如何实现 在回答中,我想加入,这样我就可以监听任何变化。为此,我装饰了setItem()和removietem()函数 我知道我可以通过创建新的函数来装饰函数,这些函数在某种程度上称为原始函数 var _setItem = localStorage.setItem; localStorage.setItem = function () { _setItem.appl

我已经写了一篇文章,其中我必须写一些装饰器,这样我就可以钩住一些函数调用。然而,我也希望钩住属性setter调用,但我不确定如何实现

在回答中,我想加入,这样我就可以监听任何变化。为此,我装饰了
setItem()
removietem()
函数

我知道我可以通过创建新的函数来装饰函数,这些函数在某种程度上称为原始函数

var _setItem = localStorage.setItem;
localStorage.setItem = function () {
    _setItem.apply(this, arguments);
    localStorageObserver.notifySubscribers(arguments[0]);
};
这很有效,但我还想使用其他功能,比如属性访问。以下是存储对象的所有等效项:

localStorage.setItem('someProperty', 'value');
localStorage.someProperty = 'value';
localStorage['someProperty'] = 'value';
因此,我需要将最后两个案例联系起来,但我不确定如何才能做到这一点

如何编写动态属性的装饰器?有可能吗?

我想我可以手动创建属性,因为它们被设置为隐藏存储对象所做的事情,但这似乎不是很具有可伸缩性。如果有一个简单的
setProperty(name,value)
函数可以挂接,我就可以修饰它。但据我所知,这并不存在

如何为动态属性编写装饰器?有可能吗

从ES5开始,对于真正的JavaScript对象,您可以通过
Object.defineProperty
将属性替换为getter/setter对,从而修饰可以找到其名称但不知道其名称的属性。在ES6中,可以创建“代理”,允许您将外观完全放在现有对象的前面,甚至在您还不知道名称的proeprites上拦截get/set,前提是允许您用外观替换对象


在ES5中,所讨论的对象必须是一个真正的JavaScript对象,而对于主机提供的对象,如
localStorage
,则不能保证这一点。在ES6情况下,您必须能够使用自己的facade对象覆盖
localStorage
,但由于
localStorage
是主机提供的,因此无法保证您可以并且有充分的理由相信您将不被允许(并且在Chrome上尝试过,在Chrome上就不能).

localStorage.key
表示它是一个function@JeffMercado对不起,我好像不知道装饰师是干什么的。我可以接受。至少对于一个facade对象,我可以说,如果您想充分利用所添加的功能,就必须使用facade。我认为在这种情况下这是合理的。