任何人都可以解釋JavaScript通過調用方法來選擇哪個函數運行的過程?我可以找到的大多數在線資源都解釋瞭如何使用JavaScript對象實現特定行爲,但不解釋方法派發在JavaScript中如何工作的一般原則。JavaScript方法調度過程
回答
「Method dispatch」實際上只是屬性查找,因爲JavaScript中的「methods」只是通過對象屬性使用的函數。 (更多關於我的博客:Mythical methods)
當你寫:
obj.prop
JavaScript引擎着眼於obj
對象,看它是否有一個名爲"prop"
的屬性。如果是,則使用該屬性的值。如果不是,則引擎會查看obj
的原型對象,看看它是否具有該名稱的屬性。如果是這樣,它使用它的值。如果不是,則看即對象的原型。沖洗,重複,直到它用完原型對象。
有沒有任何種類的「方法簽名」匹配,如在某些允許方法重載的語言中。 JavaScript沒有方法重載。只能有一個附加到具有給定名稱的對象的標籤。
讓我們來看一個例子:
function Thing() {
}
Thing.prototype.test = function() {
return "Thing#test";
};
var t = new Thing();
t.own = function() {
return "My own";
};
現在讓我們用t
玩:
console.log(t.own()); // Logs "My own"
爲了表達t.own
,發動機看着t
,看它是否有一個名爲"own"
屬性。它的確如此,所以使用該屬性(函數)的值。 ()
之後它調用函數,它返回"My own"
,我們就完成了。
console.log(t.test()); // Logs "Thing#test"
爲了表達t.test
,發動機着眼於t
,看它是否有一個名爲"test"
屬性。它沒有,所以引擎看着t
的原型。 t
的原型是Thing.prototype
,在表達式new Thing
期間被分配給它。 Thing.prototype
有一個"test"
屬性,所以使用該值(一個函數)。然後在調用該函數後返回()
,該函數返回字符串"Thing#test"
。
console.log(t.toString()); // Logs "[object Object]"
發動機着眼於t
,沒有找到"toString"
屬性,所以它看起來在t
的原型,並沒有找到"toString"
屬性,所以它看起來在t
的原型的原型(其中是Object.prototype
)。那確實有一個"toString"
屬性,它的值是一個函數。然後()
調用該函數,該函數返回"[object Object]"
。
最後,爲了完整性:
console.log(t.foo()); // Throws an error
,發動機不會找到t
"foo"
,t
的原型,或t
的原型的原型。現在它沒有原型,因此表達式t.foo
的結果爲undefined
。然後我們嘗試通過()
調用它,這是我們無法做到的,因爲undefined
不是函數。
- 1. 通過HTTP方法的Hunchentoot調度
- 2. 通過參考在JavaScript(調用方法)
- 3. 通過Javascript調用Python方法
- 4. 通過COM接口調用JavaScript方法
- 5. 通過Javascript調用rails ruby方法
- 6. 2sxc |通過調整W/Javascript方法
- 7. pthread調度方法?
- 8. 有沒有通過編程調整屏幕亮度的方法?
- 9. 調度方法調用C#
- 10. Javascript調用方法
- 11. JavaScript調用()方法
- 12. JavaScript方法調用
- 13. 無法調用Javascript方法
- 14. 推薦測試調度程序/調節程序的方法
- 15. 在蟒蛇子過程調用方法
- 16. 通過協程調用方法給NullReferenceException
- 17. JavaScript數組長度方法
- 18. 調度存儲過程「ORACLE」
- 19. JUnit動態方法調度?
- 20. 無法通過javascript調用
- 21. JavaScript調用存儲過程
- 22. 從java方法調用javaScript
- 23. JavaScript調用類方法
- 24. 從javascript調用jquery方法
- 25. 從UIWebView調用javascript方法
- 26. 調用Javascript工廠方法
- 27. 從javascript調用serverside方法
- 28. JavaScript調用類方法
- 29. 從Java調用JavaScript方法
- 30. 從JavaScript調用PHP方法