Привожу фрагмент класса, вопросы прямо в коде + пояснение к ним - после кода:
Фрагмент классаexport class Database {
constructor(config) {
this.config = config;
}
init() {
return new Promise((resolve, reject) => {
const dbname = this.config.dbname; // 1) Почему this тут undefined?
const version = this.config.version; // 2) Почему, несмотря на это, dbname и version заполняются корректно?
debugger;
const openRequest = indexedDB.open(dbname, version);
openRequest.onupgradeneeded = (event) => {
debugger;
this.database = openRequest.result; // 3) Почему this тут IDBOpenDBRequest?
this.createStorages(); // 4) Почему при этом вызывается метод createStorages() класса?
resolve(true);
}
})
}
private createStorages() {
debugger;
this.config.storages.forEach(s => {
if (!this.database.objectStoreNames.contains(s.name)) {
this.database.createObjectStore(s.name, s.settings);
}
});
}
// Остальная часть класса
}
// Использование класса
const database = new Database(idbConfig);
database.init();
1) Не понимаю, почему здесь this получается undefined? Ведь в лямбдах this становится такой же, как this из внешнего блока в момент
создания лямбды. Я вызываю метод init на экземпляре database, значит this в init указывает на этот экземпляр. Лямбда создается внутри init, перед тем как отправиться в промис, значит хотя бы на строчке `const dbname = this.config.dbname;` this должен указывать на экземпляр database. Но в консоли браузера отображается как undefined.
2) Несмотря на то, что this якобы undefined, переменные заполняются корректно. Т.е. как будто бы this все же указывает на экземпляр.
3) Здесь тоже не понятно, почему this получается IDBOpenDBRequest. Исходя из 1), this в промисовской лямбде должен указывать на экземпляр. Значит лямбда под событие onupgradeneeded берет this из внешней лямбды, а значит и в событийной лямбде this должен указывать на экземпляр.
4) Тем более не понятно, как может вызываться метод createStorages(), если this якобы указывает на IDBOpenDBRequest?