Доступ к объекту в 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');