2017-01-12 87 views
1

的一些屬性時,當我做訪問的XMLHttpRequest

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

在屬性列表非法調用返回,我得到timeout。在同一個控制檯,當我輸入

XMLHttpRequest.prototype.timeout 

我得到這個錯誤:Uncaught TypeError: Illegal invocation

爲什麼?

如何將超時引用的對象分配給另一個變量?

回答

0

timeout似乎是一個吸氣劑,必須在實際的XHR 實例而不是XMLHttpRequest.prototype上調用。沒有引用它的對象,你不能將它分配給任何東西。

+0

通過XHR情況下,你的意思是有'XMLHttpRequest.prototype'爲原型的對象? – Gradient

+0

是的,但更具體的是一個由「new XMLHttpRequest」構造函數調用初始化並擁有必要的內部屬性的構造函數。 – Bergi

1

您需要調用由XMLHttpRequest創建的實例的獲取方。它應該已經從XMLHttpRequest.prototype繼承,所以下面可能會是不夠的:

instance.timeout 

如果由於某種原因,你改變了instance的[[原型]]鏈,或陰影timeout,這時你可以手動調用的getter:

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

或者,由於ES6,

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

謝謝!但是爲什麼如果不從實例調用它會失敗呢?在XMLHttpRequest.prototype.timeout的代碼中,如果不是實例,它會不可調用?你有沒有找到我可以找到這些信息的鏈接? – Gradient

+0

@Gradient [The spec](https://xhr.spec.whatwg.org/#the-timeout-attribute)。 「'timeout'屬性必須返回它的值」。非實例不會有內部的'timeout'值,所以'timeout'屬性getter會拋出。這在[WebIDL](https://heycam.github.io/webidl/#dfn-attribute-getter)中正式規定 – Oriol