Примечание. Это решение использует TypScript (вы можете использовать vanilla JS, который TS компилирует, если необходимо)
blockquote>class asd { def = new class { ads= 'asd'; qwe= this.ads + '123'; }; // this method is just to check/test this solution check(){ console.log(this.def.qwe); } } // these two lines are just to check let instance = new asd(); instance.check();
Здесь использовались выражения классов для получения вложенного объекта который нам нужен. Это лучшая вещь, с которой ИМХО может ссылаться на свойства объекта во время создания.
Главное, что нужно учитывать при использовании этого решения, у вас есть тот же интерфейс, который у вас был бы с объект литерал. Синтаксис довольно близок к самому объекту (с использованием функции и т. Д.).
Сравните следующее
Решение, которое я предложил
class asd { def = new class { ads= 'asd'; qwe= this.ads + '123'; };
Решение, если бы литералы объектов были бы достаточными
var asd = { def : { ads:'asd', qwe: this.ads + '123';, //ILLEGAL CODE; just to show ideal scenario } }
Другой пример
Здесь, в этом классе, вы можете объединить несколько относительных путей между собой, что невозможно с объектом литерал.
class CONSTANT { static readonly PATH = new class { /** private visibility because these relative paths don't make sense for direct access, they're only useful to path class * */ private readonly RELATIVE = new class { readonly AFTER_EFFECTS_TEMPLATE_BINARY_VERSION: fs.PathLike = '\\assets\\aep-template\\src\\video-template.aep'; readonly AFTER_EFFECTS_TEMPLATE_XML_VERSION: fs.PathLike = '\\assets\\aep-template\\intermediates\\video-template.aepx'; readonly RELATIVE_PATH_TO_AFTER_EFFECTS: fs.PathLike = '\\Adobe\\Adobe After Effects CC 2018\\Support Files\\AfterFX.exe'; readonly OUTPUT_DIRECTORY_NAME: fs.PathLike = '\\output'; readonly INPUT_DIRECTORY_NAME: fs.PathLike = '\\input'; readonly ASSETS_DIRECTORY_NAME: fs.PathLike = '\\assets'; }; } }