javascript - JavaScript 对象可以返回一个值和控制台日志吗?
问题描述
我有一个看起来像这样的对象:
const CONVERT = {
a: 1,
b: 2,
c: 100,
};
我像这样使用它:
let x = 'a';
// some logic that may change x
const value = CONVERT[x];
假设我知道当 x = 'c' 这是一个错误情况。当 x = 'c' 时,我想console.error('value 限制在 100') 。
在 CONVERT 对象分配中是否有一种优雅的方法来执行此操作?我希望我能做这样的事情:
const CONVERT = {
a: 1,
b: 2,
c: ( ()=> { console.error( 'value clamped at the limit of 100' ); return 100; )(),
};
...但这不会在调用 CONVERT['c'] 时出现 console.error 消息,而是在实例化 CONVERT 对象时立即执行此操作。
我能想到的唯一选择是:
let x = 'a';
// some logic that may change x
const value = CONVERT[x];
if( value === 100 ) {
console.error( 'value clamped at the limit of 100' );
}
但这意味着无论我在哪里使用 CONVERT,我现在都需要做这个额外的 if-check 以便我可以 console.error 获得所需的消息。如果我知道 x 不等于'c',我想避免完全执行此 if-check。
我的另一个选择是摆脱 CONVERT 对象,而是硬编码一个 if-else 或 switch,如下所示:
let value;
if( x === 'a' ) {
value = 1;
} else if( x === 'b' ) {
value = 2;
} else if( x === 'c' ) {
value = 100;
console.error( 'value clamped at the limit of ', value );
}
这也是,我希望我可以通过使用查找对象来绕过。
解决方案
您似乎可能在使用getter,这是一个可以在属性访问时执行的函数。您从 getter 返回的值CONVERT['c']
是评估为:
const CONVERT = {
a: 1,
b: 2,
get c() {
console.error( 'value clamped at the limit of 100' );
return 100;
}
};
let x = 'a';
x = 'c'; // some logic that may change x
const value = CONVERT[x];
console.log(value);
推荐阅读
- java - 如何在给定时间内多次调用方法java
- rest - 如何在许多项目中使用 LexikJWTAuthenticationBundle 作为身份提供者?
- jena - Jena TDB2 汇编器从文件加载数据
- raspberry-pi - 用于覆盆子 pi 的 ktor 客户端多平台?
- python - Python if 语句逻辑混乱
- javascript - 承诺待定
- c++ - 为什么 Visual Studio 2019 默认为 C++14 而不是 C++17?
- flutter - 如何在颤动的文本字段中的每个新行上添加前缀小部件?
- python - 如何在 Python 中从 3d 热图创建视频?
- laravel - Trying to get property 'name' of non-object laravel 8