使用Object.create()

时间:2016-05-03 14:39:23

标签: javascript xmlhttprequest

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

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

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

不应该openreq的原型链中吗?

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

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

就在我认为我用JS的OO方式出了问题的时候,这让我回到了原因:)

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

1 个答案:

答案 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,它接近你想要完成的任务。但它在浏览器中的支持有限。