因此,当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传输的变量。
答案 0 :(得分:3)
JSON没有编码功能的规定。它仅适用于数据。
当然,您可以将函数序列化为JavaScript中的字符串,并且同样可以重新构建它们,但这在其他语言中效果不佳。 (你的Python代码用JavaScript函数做什么?)
如果你考虑数据交换的一般问题,特别是涉及来自不完全信任的提供商的服务时,通过数据编码允许函数的想法变得非常可怕。
答案 1 :(得分: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];
答案 2 :(得分:2)
解决此问题的常用方法是为您的对象(cData
)提供静态factory method,它将接受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
工厂方法)。
作为旁注,你应该考虑making use of BumpyCaps when naming Constructor Functions(即:第一个字符应该是大写字母,即:MyClass
而不是myClass
,就像你的任何其他函数一样。)< / p>