Почему я не могу создать метод, который «for / in» просматривает значения в этом же объекте? - PullRequest
0 голосов
/ 25 сентября 2019

Может кто-нибудь объяснить, почему функции 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, каждый из которых имеет значение, заданное через приглашение

alert (calculator.sum ());должен предупреждать суммой значений v1 и v2 (+ любые другие, созданные в read ()

alert (calculator.mul ()); должен предупреждать произведение значений v1 и v2 (+любые другие созданные в read ()

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Несколько проблем:

  1. this.prop не определено - вы хотите this[prop]
  2. ваши циклы for / in также будут перечислять sum, mul и read
  3. ваша mul функция начинается с 0, поэтому всегда будет 0

Один из способов исправить это - проверить свойства, чтобы убедиться, что они sum, mul или read и игнорируйте их в цикле

Но есть более простой способ, используя Object.defineProperties - свойство по умолчанию enumerable свойства, созданного этимпуть ложен - так что он не попадет в цикл for

Обратите внимание, я жестко закодировал входы и 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() );
0 голосов
/ 25 сентября 2019

Спасибо за ваш ответ, я оставил комментарий под ним.Чтобы добавить к моему комментарию, я не понимаю, почему эти первые 2 решения работают, но не 3-е (где я копирую первое решение, но использую нотацию «[]» вместо «.» Для доступа к значениям:

РАБОТАЕТ:

let calculator = {
  read() {
        this.v1 = 12;
      this.v2 = 13;
  },

  sum() {
      let result = 0;
      for(let prop in this){
        if(typeof this[prop] == 'number'){
            result += this[prop]
        }
      }
      return result   
  },

    mul() {
        let result = 1;
        for(let prop in this){ 
        if(typeof this[prop] == 'number'){
                result *= this[prop]
        }
      }
        return result
  },
};

calculator.read();
console.log( calculator.sum() );
console.log( calculator.mul() );

РАБОТАЕТ:

let calculator = {
  read() {
        this.v1 = 12;
      this.v2 = 13;
  },

  sum() {
      return this.v1 + this.v2   
  },

    mul() {
            return this.v1 * this.v2
  },
};

calculator.read();
console.log( calculator.sum() );
console.log( calculator.mul() );

НЕ РАБОТАЕТ:

let calculator = {
  read() {
        this.v1 = 12;
      this.v2 = 13;
  },

  sum() {
      let result = 0;
      for(let prop in this){
        if(typeof this.prop == 'number'){
            result += this.prop
        }
      }
      return result   
  },

    mul() {
        let result = 1;
        for(let prop in this){ 
        if(typeof this.prop == 'number'){
                result *= this.prop
        }
      }
        return result
  },
};

calculator.read();
console.log( calculator.sum() );
console.log( calculator.mul() );

Существуют ли конкретные сценарии использования this.prop и специальныеСценарии использования этого [проп]?

Спасибо!

...