Javascript 如何为现有对象设置常规getter?
我对添加公共getter感兴趣,它将在现有对象的每个属性get调用上执行。 我们都知道如何为特定属性设置getter,但我们能设置getter吗?在获取对象中的每个属性时,将涉及哪个回调Javascript 如何为现有对象设置常规getter?,javascript,object,ecmascript-6,default-value,ecmascript-next,Javascript,Object,Ecmascript 6,Default Value,Ecmascript Next,我对添加公共getter感兴趣,它将在现有对象的每个属性get调用上执行。 我们都知道如何为特定属性设置getter,但我们能设置getter吗?在获取对象中的每个属性时,将涉及哪个回调 非常感谢。我想你正在考虑一个新的方案 具体来说,您可以使用截取任何属性 实例 const吉他={ stringCount:6, 型号:“Stratocaster”, }; //这就是魔法发生的地方 常量genericHandler={ 获取:函数(目标,propertyName){ //在这一点上,您可以做任何
非常感谢。我想你正在考虑一个新的方案 具体来说,您可以使用截取任何属性 实例
const吉他={
stringCount:6,
型号:“Stratocaster”,
};
//这就是魔法发生的地方
常量genericHandler={
获取:函数(目标,propertyName){
//在这一点上,您可以做任何您想做的事情–我们将只记录尝试
log(`trusted to get${propertyName}`);
//这将返回原始值
返回目标[propertyName];
}
};
const proxiedGuitar=新代理(吉他、genericHandler);
//这个输出
//试图获取stringCount
// 6
console.log(proxiedGuitar.stringCount);
//您甚至可以为不存在的属性编写处理程序
console.log(proxiedGuitar.pickupType);
这是一个简化且不完整的示例,在某些情况下可能不起作用。请参阅下面评论中@loganfsmyth的说明。您需要一个用于此目的的文件。如果它明确需要使用现有对象,则这是不可能的。代理可以做到这一点,但需要一个新的对象,而且代理相当复杂,在我看来通常不是一个好主意。您希望getter做什么?这是一个糟糕的
get
处理程序get
传递了3个参数,因此您应该使用Reflect.get
查找要返回的属性。这也是一个不完整的代理膜,因此您应该提到,在许多情况下,这会损坏,例如吉他
对象存储在weakmap中,或者是使用私有类属性的类。@loganfsmyth感谢您的澄清!你说得对。我的意图并不是提供产品代码(尽管这可能是这个网站的许多用户所期望的…),只是对一个简单问题的简单回答——引入代理的概念。