的一些屬性時,當我做訪問的XMLHttpRequest
for (key in XMLHttpRequest.prototype) {
console.log(key);
}
在屬性列表非法調用返回,我得到timeout
。在同一個控制檯,當我輸入
XMLHttpRequest.prototype.timeout
我得到這個錯誤:Uncaught TypeError: Illegal invocation
爲什麼?
如何將超時引用的對象分配給另一個變量?
的一些屬性時,當我做訪問的XMLHttpRequest
for (key in XMLHttpRequest.prototype) {
console.log(key);
}
在屬性列表非法調用返回,我得到timeout
。在同一個控制檯,當我輸入
XMLHttpRequest.prototype.timeout
我得到這個錯誤:Uncaught TypeError: Illegal invocation
爲什麼?
如何將超時引用的對象分配給另一個變量?
timeout
似乎是一個吸氣劑,必須在實際的XHR 實例而不是XMLHttpRequest.prototype
上調用。沒有引用它的對象,你不能將它分配給任何東西。
您需要調用由XMLHttpRequest
創建的實例的獲取方。它應該已經從XMLHttpRequest.prototype
繼承,所以下面可能會是不夠的:
instance.timeout
如果由於某種原因,你改變了instance
的[[原型]]鏈,或陰影timeout
,這時你可以手動調用的getter:
Object.getOwnPropertyDescriptor(XMLHttpRequest.prototype, "timeout")
.get.call(instance);
或者,由於ES6,
Reflect.get(XMLHttpRequest.prototype, "timeout", instance);
謝謝!但是爲什麼如果不從實例調用它會失敗呢?在XMLHttpRequest.prototype.timeout的代碼中,如果不是實例,它會不可調用?你有沒有找到我可以找到這些信息的鏈接? – Gradient
@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
通過XHR情況下,你的意思是有'XMLHttpRequest.prototype'爲原型的對象? – Gradient
是的,但更具體的是一個由「new XMLHttpRequest」構造函數調用初始化並擁有必要的內部屬性的構造函數。 – Bergi