たとえば、私はクラスを持っています:
function Test() {
}
Test.prototype = {
'setTest' : function(test) {
this.test = test;
}
}
var test = new Test();
Test.setTest('test');
オブジェクト テストをデータベースに保存したい。オブジェクト テストを文字列にシリアル化する方法は? (メソッド、変数など)
たとえば、私はクラスを持っています:
function Test() {
}
Test.prototype = {
'setTest' : function(test) {
this.test = test;
}
}
var test = new Test();
Test.setTest('test');
オブジェクト テストをデータベースに保存したい。オブジェクト テストを文字列にシリアル化する方法は? (メソッド、変数など)
jsonでシンプル
JSON.stringify( test );
この場合、あなたが求めている質問に対して、あなたが望むことをする方法は本当にありません. あなたの要求の問題は、「関数を含む、オブジェクトに添付されたすべてのものをシリアル化する」ことにあります。
通常、シリアル化はデータに対してのみ行われます。これは、実行可能ファイルが特定の特性に基づいて特定のマシン用にコンパイルされるという点で、通常はマシン バウンドであるためです。さて、javascript は 1 回書き込むだけでどこでも実行できるため、javascript 関数には javascript インタープリターが必要であると言うのが妥当です。しかし、人々がシリアライザーを作成するときは、すべてのシリアライザーが同じように機能する傾向があるため、データ専用に作成します。この場合、業界標準はオブジェクト データのみのシリアライザーである JSON です。
この時点で役立つ 3 つの解決策があります。
3 は 1 のサブアンサーであることはわかっているので、有用な回答は 2 つしかないと考えてください。
表面的にはこれが Chrome と IE9 で機能することはわかっているため、大多数のユーザーが使用する可能性が高い場所ならどこでも機能するはずです。
var abc = function(thing) { return thing; }
abc.toString();
// gives "function(thing) { return thing; }" on the command line
したがって、実際のメソッドの代わりにメソッドを文字列としてシリアル化することは確かにできますが、複製オブジェクトを作成して、ソース オブジェクトのすべての要素をキャプチャできるようにする必要があります (それらを置き換えるのではなく)。
うまくいけば、これが問題についてもう少し考えるのに役立ち、おそらくメソッドをシリアル化する必要がないことを理解するのに役立ちます(私が知っていることは誰も合理的ではありません)。
これを行う最善の方法は、getter に基づいて、属性を持つ JSON オブジェクトを作成する独自の serialize メソッドを作成することです。通常、属性ごとに getter を定義します。したがって、ほとんどの場合に機能するはずです (したがって、クラスごとにシリアル化メソッドを定義する必要はありません)。
function serialize(obj) {
var serialized = {};
for(var prop in obj) {
if (obj.hasOwnProperty(prop) && typeof obj[prop] == 'function') {
if (/^get.*/.test(prop)) {
var value = obj[prop]();
var name = prop.replace('get', '');
if (typeof value === 'object') {
serialized[name] = this.serialize(value);
continue;
}
serialized[name] = value;
}
}
}
return serialized;
};
属性値をクラスにリセットするには、次の 2 つのオプションがあります。
例:
function unserialize(obj, emptyClass) {
// Check emptyClass for setters and map the data from obj to it.
return 'class instance';
}
通常、ブラウザ/言語/ライブラリ/などで広くサポートされているJSONを使用してこれを行います。唯一の問題は、JSON が関数をサポートしていないことですが、それらをシリアライズする必要は本当にあるのでしょうか?
以前はこれに似た機能をサポートする必要がありました。関数の名前を文字列として保存し、JSONとしてシリアル化することになりました。次に、クライアントに戻ったら、この質問に投稿されているようなヘルパーを使用して関数を実行します。
誰かがこの問題を解決するためのより良い方法を持っているなら、私はそれを見たいです!
I recently had to find a solution for this problem. I'm sure it can be improved upon.
First I created a module for instantiating the "serialisable" object.
function MyObj(serialised){
this.val = "";
if(serialised){
var unserialised = JSON.parse(serialised);
for (var i in unserialised) {
this[i] = unserialised[i];
}
}
}
MyObj.prototype.myMethod = function () { return this.val;};
module.exports = MyObj;
you of course have to consider error handling and other validations.