我可以在索引数据库中存储javascript类对象吗?
我用构造函数和一些方法创建了一个名为Book的类我可以在索引数据库中存储javascript类对象吗?,javascript,class,indexeddb,Javascript,Class,Indexeddb,我用构造函数和一些方法创建了一个名为Book的类 class Book { constructor(title, author) { this.title = title; this.author = author; } displayInfo() { console.log(`Title: ${this.title}, Author: ${this.author}`); } } 然后我创建了一组Book对象,并
class Book {
constructor(title, author) {
this.title = title;
this.author = author;
}
displayInfo() {
console.log(`Title: ${this.title}, Author: ${this.author}`);
}
}
然后我创建了一组Book对象,并将它们放入一个名为Library的数组中
const book1 = new Book('Hobbit', 'JRR Tolkien');
const book2 = new Book('Mistborn', 'Brandon Sanderson');
let library = [];
library.push(book1);
library.push(book2);
console.log(library);
library.forEach(book => book.displayInfo());
然后我将这个库数组存储在indexeddb中
if (!window.indexedDB) {
window.alert("IndexedDB doesn't work");
}
let request = indexedDB.open("Database", 1);
let db, tx, store;
request.onupgradeneeded = function(e) {
let db = request.result;
let store = db.createObjectStore('Collection', { keyPath: 'type' });
};
request.onerror = function(e) {
console.log('error ' + e.target.errorCode);
};
request.onsuccess = function(e) {
db = request.result;
tx = db.transaction('Collection', 'readwrite');
store = tx.objectStore('Collection');
db.onerror = function(e) {
console.log('error ' + e.target.errorCode);
};
console.log('adding do collection db');
store.put({ type: 'library', data: library });
tx.oncomplete = function() {
db.close();
};
};
现在,我想在每次页面刷新后恢复此数组,并对数组中存储的对象运行Book方法。但当我恢复数据时,我发现我的Book对象不再是Book对象,而是常规对象,所以我不能对它们使用Book方法
if (!window.indexedDB) {
window.alert("IndexedDB doesn't work");
}
let request = indexedDB.open("Database", 1);
let db, tx, store;
request.onupgradeneeded = function(e) {
console.log('upgrading');
let db = request.result;
let store = db.createObjectStore('Collection', { keyPath: 'type' });
};
request.onerror = function(e) { console.log('error ' + e.target.errorCode); };
request.onsuccess = function(e) {
console.log('success');
db = request.result;
tx = db.transaction('Collection', 'readwrite');
store = tx.objectStore('Collection');
db.onerror = function(e) { console.log('error ' + e.target.errorCode); };
let retrievedData = store.get('library');
retrievedData.onsuccess = function(e) {
if (retrievedData.result) console.log(retrievedData);
if (retrievedData.result) library = retrievedData.result.data;
console.log(library);
library.forEach(book => book.displayInfo());
}
tx.oncomplete = function() {
db.close();
};
};
这个问题有解决办法吗
致以最良好的祝愿,
Oskar这不是一个好的做法,但在检索库对象后,您可以尝试:
retrievedData.onsuccess = function(e) {
if (retrievedData.result) console.log(retrievedData);
if (retrievedData.result) library = retrievedData.result.data;
const fixedLibrary = library.map(book => Object.setPrototypeOf(book, Book.prototype))
fixedLibrary.forEach(book => book.displayInfo());
}
尽管如此,如果您打算在数据库中存储实例,我建议您不要使用类,而是使用面向模块的方法…您自己编写简单的js到类实例转换。这个过程通常被称为“水合作用”。(查找)这可以作为book类的静态方法(例如“hydroge”)来实现。我将考虑面向模块的方法。但首先我需要在这一领域进行自我教育。你能给我推荐一本出版物或一本书,以最好的方式解释这种方法吗。当然,如果这对你来说不是问题:)提前谢谢如果你告诉我更多你想做什么(我知道这是某种API),我可以向你推荐一些教程,因为我的大部分知识和经验都来自那里……我正在尝试创建一个应用程序来跟踪用户的图书库。现在我正在尝试添加一个允许存储数据的功能。我还没有准备好服务器端编程,所以我正在寻找本地存储数据的最佳方法。如果你愿意,你可以在我的GitHub存储库中查看它,但我警告你,它现在一团糟:对我来说一切都是新的:)嘿!你能详细说明为什么这不是一个好的做法吗?谢谢:)