Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果我没有';我不知道构造器的名字?_Javascript_Prototype - Fatal编程技术网

Javascript 如果我没有';我不知道构造器的名字?

Javascript 如果我没有';我不知道构造器的名字?,javascript,prototype,Javascript,Prototype,我的理解是,每个javascript对象都有一个原型,即使它只是object.prototype中的一个 我有一个asp.net Web服务代理,可以从服务器获取参与者数据。那部分很好用。代码如下: atomWebServiceProxy.GetInteractionParticipants(interactionId, function (participantsResult) { var assetId, pending

我的理解是,每个javascript对象都有一个原型,即使它只是object.prototype中的一个

我有一个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());
            });
令我大吃一惊的是,我得到了一个异常,声称原型为空:

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”,并期望它解析为调用它的对象?是的。更具体地说,“这个”