其他人已经提到了__noSuchMethod__和Proxy,所以我将避免进一步详细介绍这些内容。
相反,我想强调另一种可以做你想做的事情的技术。请注意,这是一个丑陋的 hack,我不鼓励使用它,它甚至可能不适用于您的所有目标。考虑到这些注意事项,我向您介绍window.onerror:
window.onerror = function(err) {
if (/has no method/.test(err)) {
console.log('oh my: ' + err) // This is where you'd call your callback
return true
}
return false
}
;(function() {
this.foo() // will be caught by window.onerror
})()
这 - 至少在我非常有限的测试中 - 捕获了 TypeErrors(至少在 Chrome 中,里程可能会有所不同),这表示无法找到该方法。以下是您不应该这样做的一些原因:
window.onerror
只能有一个处理程序;如果您的处理程序被覆盖,这将不起作用
- 它在全局范围内捕获 TypeErrors,而不仅仅是针对特定对象;即很多误报
- 对于不知道在哪里找到这个处理程序的任何人来说,调试它会很有趣
- 它紧密结合了依赖于这种行为的任何代码(坏、坏、坏!)
我不认为我可以足够强调你真的不应该考虑破解它。如果可以,请使用代理,如果不能,请承认失败。