Object.prototype からのものであっても、すべての JavaScript オブジェクトにはプロトタイプがあることを理解していました。
サーバーから参加者データを取得するasp.net Webサービスプロキシがあります。その部分はうまく機能します。コードは次のとおりです。
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
};
驚いたことに、prototype が null であると主張する例外が発生しました。
JavaScript ランタイム エラー: 未定義または null 参照のプロパティ 'redraw' を設定できません
ここで何が起こっているのですか?
この質問は問題に対処しているようですが、コードで定義されていないコンストラクターを参照する方法がわからないため、この情報をこの状況に適用する方法がわかりません。
これが有用な情報である場合、実行時の即時ウィンドウでのparticipants.constructorの検査は、コンストラクターがArray()であったことを示しているように見えます
フィールドをオブジェクトにコピーしてプロトタイプを設定するコンストラクタを作成する必要がありますか? もしそうなら、C# リフレクションに相当する JavaScript があるので、クエリ結果オブジェクトのすべてのタイプに対してこれを書き直す必要はありませんか? 注comaは、質問を更新しているときに、コメントで質問のこの部分に答えました。