Template strings это не шаблон который вы можете в любой момент взять и забить нужными данными, это просто инструмент с помощью которого данные распихиваются по строке. То есть у вас на 36ой строке
cOA.begin создаётся именно с теми данными которые доступны на тот момент, а т.к.
classPet и
name не существуют в текущей области видимости, то вместо них используется
undefined.
Кстате, как по мне, так эти template strings не самый удобный механизм для обработки шаблонов, как бы ни было обманчиво их название; если пользоваться ими, то на каждый шаблон придётся иметь свою функцию. Имхо проще обрабатывать шаблоны кастомно:
(() => {
const re_template = /{(.*?)}/g;
String.prototype.process = function(data) {
return this.replace(re_template, (entry, word) => data[ word ]);
}
})();
let templates = {
greeting: 'Hello, my name is {name} and my age is {age}'
};
// Напрямую:
templates.greeting.process({ name: 'Yeshua', age: 2019 });
// Hello, my name is Yeshua and my age is 2019
templates.threat.process({ reason: 'i dont like you' });
// TypeError: Cannot read property 'process' of undefined
// Или автоматически вызывая process с помощью Proxy:
// (то же можно было реализовать просто с помощью дополнительной функции)
templates = new Proxy(templates, {
get(target, prop) {
if (prop in target) {
return String.prototype.process.bind(target[prop]);
} else {
throw new Error(`String "${ prop }" was not found in storage!`);
}
}
});
templates.greeting({ name: 'Yeshua', age: 2019 });
// Hello, my name is Yeshua and my age is 2019
templates.threat({ reason: 'i dont like you' });
// Error: String "threat" was not found in storage!