2017-01-12 18 views
1

のいくつかのプロパティにアクセスするとき、私は返されるプロパティのリストで不正な呼び出しのXMLHttpRequest

for (key in XMLHttpRequest.prototype) { 
    console.log(key); 
} 

を行うと、私はtimeoutを取得します。私は

XMLHttpRequest.prototype.timeout 

を入力するときに、同じコンソールで、私はこのエラーを取得する:Uncaught TypeError: Illegal invocation

なぜ?

タイムアウトで参照されるオブジェクトを別の変数に割り当てるにはどうすればよいですか?

答えて

0

timeoutは、XMLHttpRequest.prototypeではなく、実際のXHR インスタンスで呼び出されなければならないゲッターのようです。それによって参照されるオブジェクトはなく、何にも割り当てることはできません。

+0

は、あなたはそのプロトタイプとして 'XMLHttpRequest.prototype'を持つオブジェクトを意味するのですか? – Gradient

+0

はい、しかしもっと具体的には、 'new XMLHttpRequest'コンストラクタ呼び出しで初期化され、必要な内部プロパティを持っています。 – Bergi

1

XMLHttpRequestで作成されたインスタンスでゲッターを呼び出す必要があります。

instance.timeout 

場合はinstanceの[[プロトタイプ]]チェーンを変更、またはtimeoutを陰に何らかの理由で、その後、手動でゲッターを呼び出すことができます:それは、すでに以下は、おそらく十分でしょうので、XMLHttpRequest.prototypeから継承する必要があります

Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, "timeout") 
     .get.call(instance); 

あるいは、ES6以来、XHRインスタンスによって

Reflect.get(XMLHttpRequest.prototype, "timeout", instance); 
+0

ありがとうございました!しかし、インスタンスから呼び出されないと失敗するのはなぜですか? 'XMLHttpRequest.prototype.timeout'のコードは、インスタンスになければそれをuncallableにしますか?私はこの情報をどこに見つけたのでしょうか? – Gradient

+0

@Gradient [仕様](https://xhr.spec.whatwg.org/#the-timeout-attribute)。 msgstr "' timeout'属性はその値を返さなければなりません "msgid。非インスタンスは内部的な 'timeout'値を持たないので、' timeout'属性getterは投げます。これは[WebIDL](https://heycam.github.io/webidl/#dfn-attribute-getter)で正式に指定されています。 – Oriol

関連する問題