在javascript中使用原型设计是否会对ajax调用和异步代码产生负面影响

Does the use of prototyping in javascript have a negative effect on ajax calls and asynchronous code?

本文关键字:代码 异步 调用 影响 ajax javascript 原型 是否      更新时间:2023-09-26

如果我添加了以下对象和原型功能。

function Hello (input){
    this.input = input
}
Hello.prototype.ajaxcall = function(id){ 
    $.get("/ajax/method", {parameter:input}, function(data){ 
        $("#"id).html(data); 
    });
}

如果语法不完全正确,请原谅它,但它应该做的是接收元素 id,执行 ajax 调用并将 ajax 调用结果分配给 id 的 innerHTML。ajaxcall 函数在对象的所有实例之间共享的事实是否会导致以下问题:例如,如果 20 个对象一起创建并立即调用此函数,则将哪些数据分配给哪个 id?

如果是这种情况,将异步方法放在对象构造函数中是否有意义?

如果创建 20 个对象并调用 ajaxcall 函数会发生什么?很少。ajax 调用将以异步方式运行。完成后,它们将排队,以便在主线程上的当前运行操作完成时在主线程上运行。

因此,下次有时间时,回调函数会在队列中同步运行。这里不会发生任何不好的事情。

我不明白你关于构造函数的问题。这会改变什么?如果您使用 Hello 对象,它们有一个实例变量。这包含在回调闭包中。创建新函数不会更改另一个回调函数中的值。

如果您使用相同的ID,则当文本更改时,内容可能会闪烁,并且您不知道最后会运行哪个回调,但这是可能发生的最糟糕的事情。

应该没有问题。 您使用 20 种不同的id调用该函数 20 次不同的时间。

不过从概念上讲。 我不明白为什么这是你对象的一部分。 该函数根本不使用对象本身的任何内容。

这个特定的例子会起作用。你的函数不使用任何实例变量,所以以这种方式声明它并没有真正的意义,但把它移到构造函数中就更没有意义了。它仍然可以工作,因为 id 参数不会在调用之间共享。

编辑:所以现在你已经改变了它,以便它确实使用了一个实例变量,你的语法是错误的,它需要

{parameter : this.input}

但除此之外,它仍然有效。异步行为对于所示代码来说不是问题。