在自定义类上使用JSON.stringify

sca*_*les 6 javascript json node.js

我正在尝试将对象存储在redis中,这是一个类的实例,因此具有函数,这是一个示例:

function myClass(){
    this._attr = "foo";
    this.getAttr = function(){
        return this._attr;
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法将这个对象与函数一起存储在redis中?我试过JSON.stringify()但只保留了属性.如何存储函数定义并能够执行以下操作:

var myObj = new myClass();
var stringObj = JSON.stringify(myObj);
// store in redis and retreive as stringObj again
var parsedObj = JSON.parse(stringObj);

console.log(myObj.getAttr()); //prints foo
console.log(parsedObj.getAttr()); // prints "Object has no method 'getAttr'"
Run Code Online (Sandbox Code Playgroud)

我怎么才能foo打电话parsedObj.getAttr()

先感谢您!

编辑

有建议修改MyClass.prototype并存储值,但是这样的东西(除了setter/getter之外的函数):

function myClass(){
    this._attr = "foo";
    this._accessCounts = 0;
    this.getAttr = function(){
        this._accessCounts++;
        return this._attr;
    }
    this.getCount = function(){
        return this._accessCounts;
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图说明一个函数,除了做其他的东西之外,它会在调用时计算类似计数或平均值的函数.

xia*_*oyi 9

首先,您没有定义一个类.

它只是一个对象,具有一个属性,其值是一个函数(在构造函数中定义的所有成员函数将在创建新实例时被复制,这就是为什么我说它不是一个类.)

使用时将被剥离JSON.stringify.

考虑一下你使用的是使用V8的node.js,最好的方法是定义一个真正的类,然后发挥一点魔力__proto__.无论你在类中使用多少属性(只要每个属性都使用原始数据类型),哪个属性都可以正常工作.

这是一个例子:

function MyClass(){
  this._attr = "foo";
}
MyClass.prototype = {
  getAttr: function(){
    return this._attr;
  }
};
var myClass = new MyClass();
var json = JSON.stringify(myClass);

var newMyClass = JSON.parse(json);
newMyClass.__proto__ = MyClass.prototype;

console.log(newMyClass instanceof MyClass, newMyClass.getAttr());
Run Code Online (Sandbox Code Playgroud)

这将输出:

true "foo"
Run Code Online (Sandbox Code Playgroud)


Ber*_*rgi 7

不,JSON不存储函数(这也是非常低效的).相反,使用序列化方法和反序列化构造函数.例:

function MyClass(){
    this._attr = "foo";
    this.getAttr = function(){
        return this._attr;
    }
}
MyClass.prototype.toJSON() {
    return {attr: this.getAttr()}; // everything that needs to get stored
};
MyClass.fromJSON = function(obj) {
    if (typeof obj == "string") obj = JSON.parse(obj);
    var instance = new MyClass;
    instance._attr = obj.attr;
    return instance;
};
Run Code Online (Sandbox Code Playgroud)