Можно ли сохранить объект (экземпляр класса) в файловую систему, включая его внутренние значения?
Не помещайте флажок вне темы. Я понимаю, что даже если это как-то достижимо, это не обычная практика. Это не имеет значения, если он взломан. Мне просто интересно, если это может быть достигнуто, потому что в воскресенье 8 часов, и у меня был долгий день.
function Node() {
let x = Math.random()
this.data = function() {
return x
}
}
let node1 = new Node()
// save it to the disk somehow as node1
saveNode('node1', node1)
// load it back from the disk into memory somehow, perhaps using eval??
let savedNode = loadNode('node1')
console.log(
savedNode.data(),
node1.data()
) /* these should be the same */
Вы можете подстроить объект, включая его функции, с помощью функции "модификатора" в качестве второго аргумента в JSON.stringify, но это не поможет.
Только если объект (или класс) взаимодействует. Нет, в общем случае невозможно получить доступ к значениям, скрытым за областью закрытия.
Однако вы можете сделать что-то вроде
class Node {
constructor(x = Math.random()) {
this.data = () => x;
}
toJSON() {
return {x: this.data()};
}
static fromJSON(obj) {
return new this(obj.x);
}
}
const fs = require("fs");
function save(name, obj) {
fs.writeFileSync('./${name}.json', JSON.stringify(obj), "utf-8");
}
function load(constr, name) {
return constr.fromJSON(JSON.parse(fs.readFileSync('./${name}.json', "utf-8");
}
let node1 = new Node();
save('node1', node1);
let savedNode = load(Node, 'node1');
console.log(savedNode.data(), node1.data())