使用 Object.create() 创建 XMLHttpRequest 对象

Creating XMLHttpRequest object with Object.create()

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

所以我尝试以这种方式创建 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 旨在 return 作为构造函数调用时的请求对象:var req = new XMLHttpRequest()Object.create(proto) 使用原型作为第一个参数创建一个新对象。
这两种方法做不同的事情:对象创建和初始化(第一种情况)和简单地创建一个带有原型的新对象(第二种情况)。


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

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

几乎等同于:

var obj = new XMLHttpRequest();

但是您收到一个错误:

Uncaught TypeError: Failed to construct 'XMLHttpRequest': Please use the 'new' operator


所以正确的解决方法是使用new XMLHttpRequest().
看看 Fetch API,它接近您尝试完成的目标。但它在浏览器中的支持有限。