javascript - 为什么我不能创建一个“for / in”循环遍历同一对象中的值的方法?
问题描述
谁能解释为什么 sum 和 mul 函数在以下情况下不起作用:
https://jsfiddle.net/jcq5010/xdvwh9s4/
我知道我可以只返回 this.v1 + this.v2 和 this.v1 * this.v2,但我希望编写它足够灵活,以处理在 read() 中创建的任意数量的新属性和值。
这是针对 javascript.info 中的一个挑战问题。灵活性不是问题的一部分,但我很好奇它是否可能。
read() {
this.v1 = parseInt(prompt('Please give a value:'));
this.v2 = parseInt(prompt('Please give another value:'))
},
sum() {
let result = 0;
for(let prop in calculator){
result += this.prop
};
return result
},
mul() {
let result = 0;
for(let prop in calculator){
result *= this.prop
};
return result
},
};
calculator.read();
alert( calculator.sum() );
alert( calculator.mul() );
calculator.read() 应该添加属性 v1 和 v2,每个属性都有一个通过提示给出的值
警报(计算器.sum());应该警告 v1 和 v2 的值的总和(+ 在 read() 中创建的任何其他值
警报(计算器.mul());应该警告 v1 和 v2 值的乘积(+ 在 read() 中创建的任何其他值
解决方案
几个问题:
this.prop
未定义 - 你想要this[prop]
- 您的 for/in 循环也将枚举
sum
,mul
并且read
- 你的
mul
函数以0
所以总是会导致0
修复它的一种方法是测试属性以查看它们是否是sum
,mul
或者read
在循环中忽略它们
但是有一种更简单的方法,使用Object.defineProperties
- 以这种方式创建的属性的默认enumerable
属性是 false - 所以它不会在你的 for in 循环中结束
请注意,我已经硬编码了输入和 console.log 输出,因为prompt
并且alert
很烦人
let calculator = {};
Object.defineProperties(calculator, {
read: {
value: function() {
this.v1 = 12;
this.v2 = 13;
},
},
sum: {
value: function() {
let result = 0;
for(let prop in this){
result += this[prop];
}
return result;
}
},
mul: {
value: function() {
let result = 1;
for(let prop in this){
result *= this[prop];
}
return result
}
}
});
calculator.read();
console.log( calculator.sum() );
console.log( calculator.mul() );
推荐阅读
- html - CSS 中心 ul 而 li 是文本左对齐
- javascript - 是否可以在 React 中使用流和箭头函数?
- javascript -
全部替换后和在javascript中如何检查字符串是否为空? - javascript - mongoose 上的 save() 函数不起作用
- r - 在 R 中按组使用具有特定样本大小的列表并将其应用于数据集
- excel - 如何从多个文本文件中搜索列表字符串
- apache-flink - 在 RichCoFlatMapFunction 中更新外部数据库
- c# - 在 C# 中的另一个对象内实例化用户定义的对象
- python - 为什么我需要同时从 Crypto 导入 Hash 和从 Crypto.Cipher 导入 PKCS1_OAEP 才能使 Hash.MD5 工作?
- reactjs - 将道具传递给组件:“对象作为 React 子项无效”