我的理解是每个 javascript 对象都有一个原型,即使它只是 Object.prototype 中的一个
我有一个 asp.net webservice 代理,可以从服务器获取我的参与者数据。那部分工作正常。这是代码:
atomWebServiceProxy.GetInteractionParticipants(interactionId,
function (participantsResult) {
var assetId, pendingPathFetches;
participants = participantsResult;
pendingPathFetches = participants.length;
document.title = participants.length + " participants:";
for (var i = 0; i < participants.length; i++) {
assetId = participants[i].ASSETID;
document.title += " " + participants[i].DISPLAYID;
atomWebServiceProxy.GetInteractionPath(interactionId, assetId,
function (pathResult, participant) {
participant.path = pathResult;
pathResult.participant = participant;
if (--pendingPathFetches == 0) {
setTimeout(afterInit, 20);
}
},
function (error, participant) {
alert(participant.DISPLAYID + " reported this error: " + error.get_message());
},
participants[i]
);
}
},
function (error) {
alert(error.toString());
});
您可能会注意到存在嵌套调用,并且我为每个参与者对象添加了一个路径属性,在对象模型中表示它是该特定参与者的路径数据这一事实。这也很好用。
然后我尝试向原型添加一个方法,如下所示:
var foo = participants[0];
foo.prototype.redraw = function(map) {
... //code that redraws
};
令我惊讶的是,我收到了一个异常,声称原型为空:
JavaScript 运行时错误:无法设置未定义或空引用的属性“重绘”
这里发生了什么?
这个问题似乎解决了这个问题,但我看不到如何将此信息应用于这种情况,因为我不知道如何引用我的代码中未定义的构造函数。
如果这是有用的信息,在运行时在即时窗口中检查参与者.constructor 似乎表明构造函数是 Array()
我应该编写一个将字段复制到对象并设置原型的构造函数吗?如果是这样,是否有等效于 C# 反射的 javascript,所以我不必为每种类型的查询结果对象重写它?注意昏迷在我更新问题时在评论中回答了这部分问题。