1

したがって、Ajax 呼び出しが JSON 応答を返す場合、次のようにします。

oData = JSON.parse(sReply);

どこ

var oData = new cData();

function cData() {
    this.Email = "";
    this.Name = "";
    this.test = function () {
        alert("lol");
    }
}

問題は、JSON 文字列には電子メールと名前の変数のみが含まれているため、oData = JSON.parse(sReply) が発生すると関数テストが上書きされ、関数を呼び出そうとすると存在しません。これを回避する方法はありますか?そこには多くの関数があり、JSON を介して送信したくない他の変数がある場合があります。

4

3 に答える 3

3

oData = JSON.parse(sReply);- これにより、JavaScript オブジェクトが作成されます。oData が以前にオブジェクトであったかどうかは関係ありませんcData...再割り当てしただけです。

cDataJSON 応答を取得し、そのプロパティを既存のオブジェクトに手動で割り当てることができるはずです。

var oData = new cData();
var response = JSON.parse(sReply);
oData.Email = response.Email;
oData.Name = response.Name;

または、プロパティをループすることもできます。

for (var i in response)
    oData[i] = response[i];
于 2012-05-22T13:09:32.590 に答える
3

JSON には、エンコーディング関数の規定がありません。データ専用です。

もちろん、関数を JavaScript から文字列としてシリアライズし、同様に再構成することもできますが、それは他の言語ではうまく機能しません。(あなたの Python コードは JavaScript 関数で何をしますか?)

データ交換の一般的な問題について考えると、特に完全に信頼されていないプロバイダーからのサービスが関係している場合、データ エンコーディングを介して機能を許可するという考えはかなり恐ろしいものになります。

于 2012-05-22T13:03:47.260 に答える
2

この問題を解決する一般的な方法は、Object ( ) に、DTO ( Data Transfer Object )を受け入れて新しいインスタンスを返すcData静的ファクトリ メソッドを提供することです。cData

function cData() { 
    this.Email = "";
    this.Name = "";
    this.test = function () {
        alert("lol");
    }
}

// Static factory which produces a new `cData` object from the supplied
// Data Transfer Object.  Note this function belongs to the Constructor
// function rather than instances created when it's used.
cData.fromDTO(value) {
        // Create a new cData instance.
        var result = new cData();

        // Copy the properties from the DTO.
        result.Email = value.Email;
        result.Name = value.Name;

        // Return the populated instance.
        return result;
}

次に、静的ファクトリを使用して、AJAX 呼び出しの結果を処理できます。つまり、次のようになります。

function onAjaxResponse(response) {
    var myData = cData.fromDTO(JSON.parse(response));

    // Invoke the 'test' method.
    myData.test();
}

これにより、データ トランスポート層 (サーバーからのデータ) とビジネス ロジック (JavaScript アプリケーション) が明確に分離されます。DTO のプロパティを変更する必要がある場合 (例:にName変更FirstName)、コードを 1 か所 (fromDTOファクトリ メソッド) で変更するだけで済みます。

補足として、コンストラクター関数に名前を付けるときは、BumpyCaps を使用することを検討する必要があります(つまり、最初の文字は大文字にする必要があります。つまりMyClassmyClass他の関数とは異なります)。

于 2012-05-22T13:15:13.917 に答える