Я хочу динамически создавать объекты класса с динамическим именем (извините, JS, я привык называть их классами) с помощью анонимной функции с динамическим именем. В этом ответе я узнал, что...
Начиная с ES2015, функция, созданная выражением анонимной функции, назначенным свойству объекта, получает имя этого свойства объекта.
Итак, я попробовал этот код:
// dynamically named constructor function
this['Item'] = function(size) {
this.size = size;
}
// the creation of new object of arbitrary name
let item = new this['Item']('small')
console.log(item);
console.log(this['Item'].name)
и это работает:
НО, когда я на самом деле использую имя переменной...
let clsName = 'Item';
// dynamically named constructor function
this[clsName] = function(size) {
this.size = size;
}
// the creation of new object of arbitrary name
let item = new this[clsName]('small')
console.log(item);
console.log(this[clsName].name)
Он ведет себя странно:
Сама задача для меня гораздо менее важна, чем тот факт, что поведение obj['string']
и obj[variableWithString]
отличается. Так может ли кто-нибудь объяснить мне это явление? Разве результат во втором примере не должен быть таким же, как и в первом?
console.log(this[clsName].name)
(и для первого примера тоже)? Кажется, что в первом примере это просто средство отладки, а не фактический.name
класса, как это предусмотрено спецификацией. И средство отладки (предоставляемое вашим конкретным движком и инструментами разработки) может поддерживать только статические имена свойств, а не вычисляемые. - person Bergi   schedule 24.11.2018console.log(this[clsName].name)
выводит пустую строку в обоих сценариях. Это последняя версия Chrome DevTools. Итак, вы думаете, что в обоих случаях это должно быть похоже на второй скриншот, но DevTools пытается помочь в первом, но не во втором? - person UniBreakfast   schedule 24.11.2018.name
в обоих случаях (см. связанный вопрос). Devtools (всегда) пытается быть полезным и иногда выводит дополнительные имена для функций. По-видимому, это происходит только тогда, когда вы назначаете постоянный идентификатор -this.Item = …
также должно иметь имя в отладчике. Обратите внимание, что механизмы получения имен постоянно меняются с версиями движка (пытаясь стать более полезными), это не то, о чем вам следует беспокоиться. - person Bergi   schedule 24.11.2018