7

クラスのインスタンスであるredisにオブジェクトを保存しようとしているため、関数があります。例を次に示します。

function myClass(){
    this._attr = "foo";
    this.getAttr = function(){
        return this._attr;
    }
}

このオブジェクトを関数と共に 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'"

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;
    }
}

他の処理とは別に、呼び出されるたびにカウントや平均などを計算する関数を説明しようとしています。

4

5 に答える 5

10

まず、クラスを定義していません。

これは単なるオブジェクトであり、その値が関数であるプロパティがあります(コンストラクターで定義されたすべてのメンバー関数は、新しいインスタンスを作成するときにコピーされます。そのため、クラスではないと言います)。

を使用すると、どちらが削除されます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());

これは出力します:

true "foo"
于 2012-11-27T18:12:12.947 に答える
4

いいえ、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;
};
于 2012-11-27T18:06:21.723 に答える
-3

JSON.stringify() から得られるものは文字列です。文字列にはメソッドがありません。最初にその文字列を評価する必要があります。その後、元のオブジェクトとそのメソッドを取得できます。

var myObj = new myClass();
var stringObj = JSON.stringify(myObj);

- - 編集 - - -

//Sorry use this:
var getBackObj  = JSON.parse(stringObj);
//Not this
var getBackObj = eval(stringObj);

console.log(getBackObj.getAttr()); // this should work now
于 2012-11-27T17:52:10.160 に答える