有没有办法创建一个响应任何消息的对象?假设您有以下对象:
function Dog();
Dog.prototype.speak(){
alert("woof woof");
}
var myDog = new Dog();
然后当您执行myDog.speak()
时,您会收到"Woof woof"
的提醒。但我想要的是当你调用myDog.jump()
(在类中没有定义)时,你会得到一个默认动作,比如向用户显示一个警告“你试图超越一个不存在的方法”
你知道我该怎么办?
答案 0 :(得分:3)
简短回答:你不能。
答案很长:您可以使用__noSuchMethod__但它不是标准的,并且有一些计划要删除它,因为Proxy可以做同样的事情,等等。另外,这是一个标准。 因此,您可以使用代理来执行此操作,但我不鼓励将所有对象都作为代理,因为性能原因。
就个人而言,我只是让语言抛出它自己的异常,开发人员可以检查错误控制台。
答案 1 :(得分:1)
没有基于标准的方法来做到这一点。最接近的是this。
你能得到的最接近的是:
function execute(obj, message, args) {
if (obj[message] && typeof(message) === function) {
obj[message].call(obj, args);
} else {
obj[message] = function() {
//missing method functionality a la Ruby here
};
}
}
答案 2 :(得分:0)
其他人已经提到__noSuchMethod__和Proxy所以我将不再详细介绍这些内容。
相反,我想强调另一种可以能够做你想做的事情的技巧。请注意,这是一个丑陋的黑客,我不能鼓励它的使用,它甚至可能不适用于你的所有目标。考虑到这些警告,我向您展示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
})()
这 - 至少在我非常有限的testing - 捕获TypeErrors(至少在Chrome中,里程可能会有所不同),表明无法找到该方法。以下是您不执行此操作的一些原因:
window.onerror
只能有一个处理程序;如果你的处理程序被覆盖,这将无法正常工作我认为我没有足够的压力,你应该多少考虑到这个问题。如果可以的话,尽量使用Proxy,如果不能,请承认失败。