Javascript 如果我没有';我不知道构造器的名字?
我的理解是,每个javascript对象都有一个原型,即使它只是object.prototype中的一个 我有一个asp.net Web服务代理,可以从服务器获取参与者数据。那部分很好用。代码如下:Javascript 如果我没有';我不知道构造器的名字?,javascript,prototype,Javascript,Prototype,我的理解是,每个javascript对象都有一个原型,即使它只是object.prototype中的一个 我有一个asp.net Web服务代理,可以从服务器获取参与者数据。那部分很好用。代码如下: atomWebServiceProxy.GetInteractionParticipants(interactionId, function (participantsResult) { var assetId, pending
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());
});
令我大吃一惊的是,我得到了一个异常,声称原型为空:
JavaScript运行时错误:无法设置未定义的属性“redraw”
或空引用
这是怎么回事
似乎解决了这个问题,但我看不出如何将此信息应用于这种情况,因为我不知道如何引用代码中未定义的构造函数
如果这是有用的信息,则在运行时立即窗口中检查participants.constructor会显示该构造函数是Array()
我是否应该编写一个构造函数,将字段复制到一个对象中并设置一个原型?如果是这样的话,是否有一个javascript等价于C#反射,这样我就不必为每种类型的查询结果对象重写它?注:在我更新问题时,coma在评论中回答了这部分问题。要将方法添加到对象而不是构造函数,只需直接添加,而不是通过原型:
var foo = participants[0];
foo.redraw = function(map) {
... //code that redraws
};
要将方法添加到对象而不是构造函数,只需直接添加,而不是通过原型添加:
var foo = participants[0];
foo.redraw = function(map) {
... //code that redraws
};
在这种特殊情况下,您最好只是将函数添加到对象本身,而不是尝试将其添加到原型中 但要回答您的问题“当我不知道构造函数的名称时,如何设置原型?” 不能设置现有对象的原型(不是以标准方式)。原型在施工时分配,不能(以标准方式)更改。可以更改对象原型的属性,但不能更改作为其原型的对象 对象的原型在其名为
prototype
的属性中不可用。prototype
属性与函数相关。它是通过使用new
expression(例如,new Foo()
将Foo.prototype
指定为新创建对象的原型)通过该函数创建的对象的原型
您可以通过获取ES5中对象的原型。在一些ES5之前的实现中,可以通过非标准的\uuuu proto\uuu
属性使用它。(在其中一些实现中,\uuuuuu proto\uuuuu
可以写入,这就是为什么我说不能以标准方式交换原型对象-可以在支持它的实现中以非标准方式交换。)
因此,在ES5环境中,您可以像这样扩展对象的原型:
var foo = participants[0];
foo.prototype.redraw = function(map) {
... //code that redraws
};
Object.getPrototypeOf(theObject).newstuff = "foo";
但请注意,这会改变原型,其他对象可能正在使用它!例如:
// A constructor function, and a prototype to assign to objects created with it
function Foo() {
}
Foo.prototype.hi = function() {
console.log("Hi");
};
// Create two objects
var f1 = new Foo();
var f2 = new Foo();
// Add something to the prototype of `f1`:
Object.getPrototypeOf(f1).there = function() {
console.log("there");
};
// Since `f1` and `f2` *share* the same prototype object,
// `f2` now has it too!
f2.there(); // "there"
|在这种特殊情况下,您最好只是将函数添加到对象本身,而不是尝试将其添加到原型中 但要回答您的问题“当我不知道构造函数的名称时,如何设置原型?” 不能设置现有对象的原型(不是以标准方式)。原型在施工时分配,不能(以标准方式)更改。可以更改对象原型的属性,但不能更改作为其原型的对象 对象的原型在其名为
prototype
的属性中不可用。prototype
属性与函数相关。它是通过使用new
expression(例如,new Foo()
将Foo.prototype
指定为新创建对象的原型)通过该函数创建的对象的原型
您可以通过获取ES5中对象的原型。在一些ES5之前的实现中,可以通过非标准的\uuuu proto\uuu
属性使用它。(在其中一些实现中,\uuuuuu proto\uuuuu
可以写入,这就是为什么我说不能以标准方式交换原型对象-可以在支持它的实现中以非标准方式交换。)
因此,在ES5环境中,您可以像这样扩展对象的原型:
var foo = participants[0];
foo.prototype.redraw = function(map) {
... //code that redraws
};
Object.getPrototypeOf(theObject).newstuff = "foo";
但请注意,这会改变原型,其他对象可能正在使用它!例如:
// A constructor function, and a prototype to assign to objects created with it
function Foo() {
}
Foo.prototype.hi = function() {
console.log("Hi");
};
// Create two objects
var f1 = new Foo();
var f2 = new Foo();
// Add something to the prototype of `f1`:
Object.getPrototypeOf(f1).there = function() {
console.log("there");
};
// Since `f1` and `f2` *share* the same prototype object,
// `f2` now has it too!
f2.there(); // "there"
|您是否尝试过
foo.constructor.prototype.redraw=
?是JSON吗?看看使用foo.constructor.prototype.redraw会导致jQuery-1.9.1在第2816行呕吐,说处理程序未定义,我确实尝试过。@thebreiflab:foo.constructor.prototype
通常是对象的原型,但不一定是其原型。可以写入构造函数
属性(一些“继承助手”库首先无法正确设置它),并且可以在创建对象后单独替换构造函数的原型
。不过,这两种情况都不常见。感谢您的澄清!你试过foo.constructor.prototype.redraw=
?是JSON吗?看看使用foo.constructor.prototype.redraw会导致jQuery-1.9.1在第2816行呕吐,说处理程序未定义,我确实尝试过。@thebreiflab:foo.constructor.prototype
通常是对象的原型,但不一定是其原型。可以写入构造函数
属性(一些“继承助手”库首先无法正确设置它),并且可以在创建对象后单独替换构造函数的原型
。不过,这两种情况都不常见。感谢您的澄清!在这个函数体中,我可以引用“this”,并期望它解析为调用它的对象?是的。更具体地说,“这个”