首页 > 解决方案 > 为什么我不能创建一个“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() 中创建的任何其他值

标签: javascriptmethodsjavascript-objects

解决方案


几个问题:

  1. this.prop未定义 - 你想要this[prop]
  2. 您的 for/in 循环也将枚举summul并且read
  3. 你的mul函数以0所以总是会导致0

修复它的一种方法是测试属性以查看它们是否是summul或者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() );


推荐阅读