Доступ к объекту в JavaScript с аргументом функции

Я хочу сделать своего рода "список покупок" в JS. У меня проблемы с доступом к объекту с аргументом функции.

shopList = {
  create: function createList(listName) {
    listName = {};
    listName["Banana"] = 2
  },

  output: function output(listName) {
    console.log(listName)
  },

};

shopList.create('list')
shopList.output('list')

Когда я запускаю shopList.output, возвращается список. Как мне получить доступ к объекту через аргумент? Надеюсь, это не дубликат, гуглил уже несколько часов и не добился никакого прогресса.

2 ответа

Решение

Если вы хотите иметь возможность настраивать списки с динамическими именами, вам нужно использовать скобки для создания списков в this объект. Как это:

var shopList = {
    create: function createList(listName) {
        this[listName] = {};
        this[listName]["Banana"] = 2
    },

    output: function output(listName) {
        return this[listName];
    }
};

shopList.create('list');
console.log(shopList.output('list'));

Однако, как отметил @armchairdj в комментариях, лучше создать свойство, выделенное для контейнера, для хранения списков:

var shopList = {
    lists: {},

    create: function createList(listName) {
        this.lists[listName] = {};
        this.lists[listName]["Banana"] = 2
    },

    output: function output(listName) {
        return this.lists[listName];
    }
};

Если вы хотите избежать путаницы методов вашего объекта showList путем наивного добавления произвольных пользовательских ключей, вам следует создать внутреннее пространство имен для ваших списков.

var shopList = {
  lists:  {},

  create: function (listName) {
    this.lists[listName] = this.lists[listName] || {};

    this.lists[listName].Banana = 2;
  },

  output: function (listName) {
    var list = this.lists[listName];

    if (!list) {
      return console.log('No list named ' + listName + ' found.');
    }

    console.log(list)
  }
};

shopList.create('output');
shopList.output('output');
shopList.create('foo');
shopList.output('foo');
shopList.output('bar');

Другие вопросы по тегам