javascript - 使用 get/set 定义一个属性,其行为类似于普通属性
问题描述
考虑以下代码:
function Foo(){this.bar=42;}
Object.defineProperty(Foo.prototype, "baz", {
get:function(){return 25;},
set:function(val){}
});
var foo = new Foo();
for(var x in foo) console.log(x);
我可以(如果也实现了其余部分)使用foo.bar
并且foo.baz
没有注意到后者不是“真实”属性。
但它没有出现在破坏我的代码的 for 循环中。
我基本上想在设置属性时进行拦截,例如对其做出反应或委托给其他东西。
我怎样才能做到这一点?
解决方案
您遇到的问题是由于您定义的属性不是enumerable
. 来自mdn:
enumerable
true
当且仅当此属性在枚举相应对象的属性期间出现。默认为
false
.
enumerable: true
您可以通过在您的属性中指定来解决此问题descriptor
:
function Foo(){this.bar=42;}
Object.defineProperty(Foo.prototype, "baz", {
get:function(){return 25;},
set:function(val){},
enumerable: true
});
var foo = new Foo();
for(var x in foo) console.log(x);
编辑:针对您关于对象中 getter 定义的属性的可枚举性的评论,似乎是的,在对象文字中定义的 getter 是可枚举的,但不是在类定义中定义的。我不完全确定文档中对此进行了描述,但如果有人找到它,我很乐意用它来更新我的答案。
const foo = {
get bar () {
return 'baz';
}
}
console.log(Object.keys(foo));
// ["bar"]
class Bar {
get baz () {
return 'qux';
}
}
console.log(Object.keys(new Bar()));
// []
推荐阅读
- apache-commons-lang - Apache下commons-lang工具包下BooleanUtils类的xor(true, true, true)结果为假,为什么?
- stripe-payments - 如何从后端手动完成条带结帐会话以进行测试?
- javascript - Javascript getAttribute("value") 不返回用户输入
- scala - 如何在akka http路由中处理长时间运行的请求
- json - Ansible - 循环和 json_query 的问题
- ios - 如何为支持的 swift 获取唯一的 DeviceID
- dashboard - 根据 Tableau 中的列计算总时间
- 3d - 是否可以预先将 .step、.x_t .x_b 转换为另一种格式,或者通过 Three.js 以任何方式输出?
- mysql - Symfony,Doctrine 在存储到数据库之前截断 Json 中的字符串
- postgresql - 我们如何在 Testcontainers R2DBC 中初始化模式?