Задать вопрос
@mala1002
Программист. В основном Front-end

Как решить эту задачу с коробкой?

Есть сама коробка:
var box = {
  locked: true,
  unlock: function() { this.locked = false; },
  lock: function() { this.locked = true;  },
  _content: [],
  get content() {
    if (this.locked) throw new Error("Заперто!");
    return this._content;
  }
};

Внутри лежит массив, но до него можно добраться только, когда коробка не заперта. Напрямую обращаться к свойству _content нельзя.
Необходимо написать функцию withBoxUnlocked, принимающую в качестве аргумента функцию, которая отпирает коробку, выполняет функцию, и затем обязательно запирает коробку снова перед выходом – неважно, выполнилась ли переданная функция правильно, или она выбросила исключение.
function withBoxUnlocked(body) {
  // Ваш код
}

withBoxUnlocked(function() {
  box.content.push("золотишко");
});

try {
  withBoxUnlocked(function() {
    throw new Error("Пираты на горизонте! Отмена!");
  });
} catch (e) {
  console.log("Произошла ошибка:", e);
}
console.log(box.locked);
// → true

Также в качестве призовой игры убедитесь, что при вызове withBoxUnlocked, когда коробка не заперта, коробка остаётся незапертой.
  • Вопрос задан
  • 269 просмотров
Подписаться 2 Оценить 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
evgeniy8705
@evgeniy8705
Повелитель вселенной
let box = {
  locked: true,
  unlock: function() {
    this.locked = false;
  },
  lock: function() {
    this.locked = true;
  },
  _content: [],
  getContent: function() {
    return this.locked ? new Error("locked") : this._content;
  }
};

let withBoxUnlocked = function(box, callback) {
  if (box.locked) {
    box.unlock();

    callback(box);

    box.lock();
  } else {
    callback(box);
  }
}

withBoxUnlocked(box, function(box) {
  box.getContent().push("gold");
});

box.unlock();
console.log(box.getContent()); // [gold]
box.lock();

console.log(box.locked); // true
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы