2016-05-03 4 views
0

クラスベースのOOPバックグラウンド(C++/Java/C#)から来ていますが、私はオブジェクト指向のJavaScriptを学習する道です。私はしばしばオブジェクトを扱うときにnew ...の代わりにObject.create(...)を使うことに関するアドバイスをJSと読む。Object.create()を使用したXMLHttpRequestオブジェクトの作成

だから私はAJAXを作成しようとしましたがそのように呼び出します。

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

openreqのプロトタイプチェーン内にあることではないでしょうか?

私も自分の物にXMLHttpRequestコンストラクタ関数を適用しようとしました:私はJSのオブジェクト指向の方法とトラブルのだと思った

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

ちょうどその時、これは後ろに:)

多く

私を引っ張ります私はここで何が起こっているのか理解するのを手伝ってくれる人に感謝します。

+0

'XMLHttpRequest'は関数です。 –

+0

"*私はしばしば、新しい...の代わりにObject.create(...)を使用することに関するアドバイスを読む* *" - いいえ。もう一度お読みください。彼らは交換できません。 – Bergi

+0

ya、この2つを印刷してみてください。 console.log(新しいXMLHttpRequest()); console.log(Object.create(XMLHttpRequest)); – Hammer

答えて

1

XMLHttpRequestは、コンストラクタとして呼び出されたときにリクエストオブジェクトを返すように設計されています。var req = new XMLHttpRequest()Object.create(proto)はプロトタイプを最初のパラメータとして新しいオブジェクトを作成します。
2つのアプローチは、オブジェクトの作成と初期化(最初のケース)と、プロトタイプ付きの新しいオブジェクトの作成(2番目のケース)という異なる動作を行います。

あなたが同じことをこのように達成しようとすることができます。もちろん、

(推奨されません):

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を見てください。しかし、それはブラウザでのサポートが限られています。

関連する問題