en.javascript.info/1-js/8-oop/5-functional-inheritance/4-add-methods-fridge/solution.md
Ilya Kantor 87bf53d076 update
2014-11-16 01:40:20 +03:00

1.8 KiB
Raw Blame History

//+ run
function Machine(power) {
  this._power = power;
  this._enabled = false;

  var self = this;

  this.enable = function() {
    self._enabled = true;
  };

  this.disable = function() {
    self._enabled = false;
  };
}

function Fridge(power) {
  // унаследовать
  Machine.apply(this, arguments);

  var food = []; // приватное свойство food

  this.addFood = function() {
    if (!this._enabled) {
      throw new Error("Холодильник выключен");
    }
    if (food.length + arguments.length >= this._power / 100) {
      throw new Error("Нельзя добавить, не хватает мощности");
    }
    for(var i=0; i<arguments.length; i++) {
      food.push(arguments[i]);  // добавить всё из arguments
    }

  };

  this.getFood = function() {
    // копируем еду в новый массив, чтобы манипуляции с ним не меняли food
    return food.slice(); 
  };

*!*
  this.filterFood = function(filter) {
    return food.filter(filter);
  };

  this.removeFood = function(item) {
    var idx = food.indexOf(item);
    if (idx != -1) food.splice(idx, 1);
  };
*/!*
}

var fridge = new Fridge(500); 
fridge.enable();
fridge.addFood({ title: "котлета", calories: 100 });
fridge.addFood({ title: "сок", calories: 30 });
fridge.addFood({ title: "зелень", calories: 10 });
fridge.addFood({ title: "варенье", calories: 150 }); 

var dietItems = fridge.filterFood(function(item) {
  return item.calories < 50;
});

fridge.removeFood("нет такой еды"); // без эффекта
alert(fridge.getFood().length); // 4

dietItems.forEach(function(item) {
  alert(item.title); // сок, зелень
  fridge.removeFood(item);
});

alert(fridge.getFood().length); // 2