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

JSON 没有编码函数的规定。它仅用于数据。

当然,您可以将函数序列化为 JavaScript 中的字符串,并类似地重构它们,但这在其他语言中效果不佳。(你的 Python 代码会用 JavaScript 函数做什么?)

如果您考虑数据交换的一般问题,特别是当它涉及来自不完全信任的提供者的服务时,通过数据编码允许功能的想法变得非常可怕。

于 2012-05-22T13:03:47.260 回答
3

oData = JSON.parse(sReply);- 这将创建一个 JavaScript 对象。oData 以前是否是一个对象并不重要cData……您只需重新分配它。

您应该能够获取 JSON 响应并手动将其属性分配给现有cData对象:

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 回答
2

解决此问题的常用方法是为您的 Object( cData) 提供一个静态工厂方法,该方法将接受 DTO ( Data Transfer Object ) 并返回一个新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),那么您只需在一处修改代码(fromDTO工厂方法)。

作为旁注,您应该考虑在命名构造函数时使用 BumpyCaps(即:第一个字符应该是大写的,即:MyClass而不是myClass像任何其他函数那样)。

于 2012-05-22T13:15:13.917 回答