Несоответствие с обозначением квадратных скобок в средствах доступа к свойствам объекта для функции-конструктора с динамическим именем. Есть объяснение?

Я хочу динамически создавать объекты класса с динамическим именем (извините, 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)

и это работает: скриншот консоли 1

НО, когда я на самом деле использую имя переменной...

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)

Он ведет себя странно: скриншот консоли 2

Сама задача для меня гораздо менее важна, чем тот факт, что поведение obj['string'] и obj[variableWithString] отличается. Так может ли кто-нибудь объяснить мне это явление? Разве результат во втором примере не должен быть таким же, как и в первом?


person UniBreakfast    schedule 24.11.2018    source источник
comment
Фраза, которую вы привели, немного вводит в заблуждение. На самом деле это не работает с назначением свойства, а скорее с объявлением литерала объекта с функцией в свойстве.   -  person Bergi    schedule 24.11.2018
comment
Вы можете сделать console.log(this[clsName].name) (и для первого примера тоже)? Кажется, что в первом примере это просто средство отладки, а не фактический .name класса, как это предусмотрено спецификацией. И средство отладки (предоставляемое вашим конкретным движком и инструментами разработки) может поддерживать только статические имена свойств, а не вычисляемые.   -  person Bergi    schedule 24.11.2018
comment
@Bergi, console.log(this[clsName].name) выводит пустую строку в обоих сценариях. Это последняя версия Chrome DevTools. Итак, вы думаете, что в обоих случаях это должно быть похоже на второй скриншот, но DevTools пытается помочь в первом, но не во втором?   -  person UniBreakfast    schedule 24.11.2018
comment
Да, пустая строка является ожидаемым результатом для .name в обоих случаях (см. связанный вопрос). Devtools (всегда) пытается быть полезным и иногда выводит дополнительные имена для функций. По-видимому, это происходит только тогда, когда вы назначаете постоянный идентификатор - this.Item = … также должно иметь имя в отладчике. Обратите внимание, что механизмы получения имен постоянно меняются с версиями движка (пытаясь стать более полезными), это не то, о чем вам следует беспокоиться.   -  person Bergi    schedule 24.11.2018