gpt4 book ai didi

javascript - 当我不知道构造函数的名称时,如何设置原型(prototype)?

转载 作者:行者123 更新时间:2023-11-30 08:52:40 28 4
gpt4 key购买 nike

据我了解,每个 javascript 对象都有一个原型(prototype),即使它只是来自 Object.prototype 的原型(prototype)也是如此

我有一个 asp.net 网络服务代理,可以从服务器获取参与者数据。那部分工作正常。这是代码:

        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());
});

您可能会注意到存在嵌套调用,并且我为每个参与者对象添加了一个路径属性,在对象模型中表示它是该特定参与者的路径数据这一事实。这也很好用。

然后我尝试像这样向原型(prototype)添加一个方法:

var foo = participants[0];
foo.prototype.redraw = function(map) {
... //code that redraws
};

令我大吃一惊的是,我得到一个异常,声称原型(prototype)为空:

JavaScript runtime error: Unable to set property 'redraw' of undefined or null reference

这是怎么回事?

This question似乎解决了这个问题,但我看不到如何将此信息应用于这种情况,因为我不知道如何引用我的代码中未定义的构造函数。

如果这是有用的信息,在运行时立即窗口中检查 participants.constructor 似乎表明构造函数是 Array()

我是否应该编写一个构造函数来将字段复制到一个对象中并设置一个原型(prototype)?如果是这样,是否有等效于 C# 反射的 javascript,这样我就不必为每种类型的查询结果对象重写它?注意 coma 在我更新问题时在评论中回答了这部分问题。

最佳答案

在这种特殊情况下,您最好只将函数添加到对象本身,而不是尝试将其添加到原型(prototype)。

但要回答您的问题“当我不知道构造函数的名称时如何设置原型(prototype)?”:

您不能设置现有对象的原型(prototype)(不是以标准方式)。原型(prototype)是在施工时分配的,不能(以标准方式)更改。您可以更改对象原型(prototype)的属性,但不能更改其原型(prototype)的对象。

对象的原型(prototype)不能从名为 prototype 的属性中获得。 prototype 属性与函数 相关。它是被分配为使用 new 表达式通过该函数创建的对象原型(prototype)的对象(例如,new Foo() 分配 Foo.prototype 作为新创建对象的原型(prototype))。

你可以通过 Object.getPrototypeOf 获取 ES5 中对象的原型(prototype).在一些 ES5 之前的实现中,它可以通过非标准的 __proto__ 属性获得。 (在其中一些实现中,__proto__ 可以被写入,这就是为什么我说你不能以标准方式交换原型(prototype)对象——你可以支持它的实现中的非标准方式。)

因此在 ES5 环境中,您可以像这样扩展对象的原型(prototype):

Object.getPrototypeOf(theObject).newstuff = "foo";

但请注意,这会更改原型(prototype),其他 对象可能正在使用它!例如:

// 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"

Live Copy | Source

关于javascript - 当我不知道构造函数的名称时,如何设置原型(prototype)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16394913/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com