正在使用object.create()创建XMLHttpRequest对象

Creating XMLHttpRequest object with Object.create()

本文关键字:创建 XMLHttpRequest 对象 create object      更新时间:2023-09-26

我来自基于类的OOP背景(C++/Java/C#),正在学习面向对象的JavaScript。我经常读到关于在处理JS对象时使用Object.create(...)而不是new ...的建议。

所以我尝试用这种方式创建AJAX调用:

var req = Object.create(XMLHttpRequest);
req.open(...); // TypeError: req.open is not a function

open不应该在req的原型链中吗?

我还尝试将XMLHttpRequest构造函数应用于我的对象:

var req = Object.create(XMLHttpRequest);
XMLHttpRequest.apply(req, null); // Constructor XMLHttpRequest requires 'new'

就在我以为JS的OO方式已经解决了问题的时候,这让我又回到了:)

非常感谢那些帮助我了解这里发生了什么的人。

XMLHttpRequest被设计为在作为构造函数调用时返回请求对象:var req = new XMLHttpRequest()Object.create(proto)创建了一个以原型为第一个参数的新对象
这两种方法做不同的事情:对象创建和初始化(第一种情况)和简单地创建一个带有原型的新对象(第二种情况)。


当然,你可以尝试用这种方式完成同样的事情(不推荐):

var obj = Object.create(XMLHttpRequest.prototype);
XMLHttpRequest.call(obj); // initialize the request

几乎相当于:

var obj = new XMLHttpRequest();

但是你收到一个错误:

未捕获的类型错误:无法构造"XMLHttpRequest":请使用"新"运营商


因此,正确的解决方案是使用new XMLHttpRequest()
看看Fetch API,它接近于您试图实现的目标。但它在浏览器中的支持有限。