来自基于类的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方式出了问题的时候,这让我回到了原因:)
非常感谢那些帮助我了解这里发生了什么的人。
答案 0 :(得分:1)
XMLHttpRequest
用于在作为构造函数调用时返回请求对象:var req = new XMLHttpRequest()
。 Object.create(proto)
创建一个新对象,原型作为第一个参数
这两种方法做了不同的事情:对象创建和初始化(第一种情况),只需创建一个带有原型的新对象(第二种情况)。
当然你可以尝试用这种方式完成同样的事情(不推荐):
var obj = Object.create(XMLHttpRequest.prototype);
XMLHttpRequest.call(obj); // initialize the request
几乎相当于:
var obj = new XMLHttpRequest();
但是你收到一个错误:
未捕获的TypeError:无法构造'XMLHttpRequest':请使用 '新'运算符
所以正确的解决方案是使用new XMLHttpRequest()
看看Fetch API,它接近你想要完成的任务。但它在浏览器中的支持有限。