2016-04-27 3 views
3

ノードサーバーを使用してフロントエンドコードにオブジェクトを送信しています。プロトタイプを使用してオブジェクトにいくつかのメソッドを追加しましたが、フロントエンドに送信するとプロトタイプメソッドが消えます。オブジェクトにはまだプロトタイプのメソッド名を持つプロパティがありますが、値は未定義に設定されています。クライアント側でプロトタイプメソッドを回復できる方法はありますか?JSプロトタイプメソッドは、オブジェクトがサーバーからクライアントに送信されると消えます。

私のコードは次のようになります。

server.js

$.ajax({url: "/data", type: "GET", success: function(data) { 
    var item = data[0]; 
    console.log(item.isEven); // displays 'undefined' 
}); 

答えて

3

オブジェクトをJSON(プレーンとしてjQueryのAjaxを介して送信されている

function Class (data) { 
    this.value = data; 
} 

Class.prototype.isEven = function() { 
    return this.value % 2 === 0; 
}; 

app.get('/data', function(req, res) { 
    db.query('select * from table', function(err, rows, fields) { 
    var items = []; 
    for (var i = 0; i < rows.length; i++) { 
     items.push(
     new Class(rows[i]['value']) 
    ); 
    } 
    res.send(items); 
    }); 
}); 

client.jsテキスト形式)。 JSONはオブジェクトのオブジェクトプロパティをシリアル化しますが、反対側のオブジェクトに変換されると、特定のオブジェクトタイプではなく、プレーンなJSオブジェクトに変換されるため、カスタムプロトタイプは一切ありませんその上に。

JSON形式には、オブジェクトの種類を取得してプロトタイプのメソッドを保持するための組み込みのメカニズムがありません。したがって、JSONを解析してもう一方のオブジェクトのオブジェクトに戻すときにプロトタイプを取得することはできません。

さらに、JSONは関数/メソッドをシリアル化することはなく、データのみをシリアル化しません。

あなたのような場合の通常の回避策は、単なる値の配列を送信することです。受信側は、それが単純な値の配列を受け取ることを知っています。その値の配列がClassオブジェクトになるようにするには、その配列をとり、適切なデータで初期化されたClassのオブジェクトの配列を構築します。

サーバーコードを変更するだけで、オブジェクトの配列ではなく、単純な不要なオーバーヘッドであるため、データ値の単純な配列を送信することもできます。

1

これは、クラスオブジェクトを文字列化するときにJavascriptでプロトタイプのプロパティが考慮されないためです。

JSON.stringify(new Class(2))に行った場合は、{"value":2}と表示されます。

Class.prototype.toJSON = function() { 
    return { 
     value: this.value, 
     isEven: this.isEven 
    } 
} 

をしかし、あなたがこれを行う場合は、機能が表示されていないことがわかります:

そのために、あなたはこのように、オブジェクトを文字列化するときに呼び出されtoJSON方法を、提供しなければなりませんまだまだどうして? ファンクションは、JSONの関数が存在しないため、JSONとしてストリング化できません。

this answerのように、関数はコードよりもはるかに機能します。

Class.prototype.toJSON = function() { 
    return { 
     value: this.value, 
     isEven: this.isEven.toString() 
    } 
} 

すると、その問題を解決するには、単にこれをやって、関数の値を取得することができます

関連する問題