Хранить функцию в хранилище данных IndexedDb


Возможно ли каким-либо образом сохранить функцию в хранилище данных IndexedDB? Я провел некоторый поиск и ничего не нашел по типам данных, которые поддерживает IndexedDB. Я попытался просто добавить функцию и экземпляр функции в хранилище объектов следующим образом, но это не сработало.

var myclass = function () {
    self = this;
    self.name = 'Sam';
    self.hello = function () {
        console.log('Hello ' + self.name);
    };
}

var transaction = db.transaction(['codeobject'], 'readwrite');
var store = transaction.objectStore('codeobject');
var request = store.put({ 'classname': 'someclass', 'object': myclass });

И я пытался.

var request = store.put({ 'classname': someclass', 'object': new myclass() });

Мне бы очень хотелось сохранить класс в object db. Даже если бы мне пришлось хранить его в виде какого-то типа большого двоичного объекта, а затем сериализовать его обратно в функцию на своем компьютере. выход.

Спасибо

2 3

2 ответа:

Если я правильно понял ваш вопрос, то вы хотите сериализовать весь объект, включая функции?

Это можно сделать, нужно только сделать возможным сериализацию функций. Дополнительную информацию об этом смотрите в разделе my blogpost.

function serialize(key, value) {
    if (typeof value === 'function') {
        return value.toString();
    }
    return value;
}

function deserialize(key, value) {
    if (value && typeof value === "string" && value.substr(0, 8) == "function") {
        var startBody = value.indexOf('{') + 1;
        var endBody = value.lastIndexOf('}');
        var startArgs = value.indexOf('(') + 1;
        var endArgs = value.indexOf(')');

        return new Function(value.substring(startArgs, endArgs), value.substring(startBody, endBody));
    }
    return value;
}

var jsonObj = {
    func: function(){ return ""; }
}
// Turns an object into a json string including functions
var objectstring = JSON.stringify(jsonObj, serialize);

// Turns an object string in JSON into an object including functions.
var object = JSON.parse(objectstring , deserialize);

Полученную строку objectstring можно сохранить в базе данных indexeddb.

Вы можете сохранить функцию в виде строки:

store.put({ 'classname': 'someclass', 'object': myclass.toString() });

И затем десериализуем его обратно в функцию через eval:

var myclass = Function('"use strict";return ' + functionString);