在Js对象中调用默认方法

时间:2013-10-23 14:34:38

标签: javascript dom

有没有办法创建一个响应任何消息的对象?假设您有以下对象:

function Dog();
Dog.prototype.speak(){
   alert("woof woof");
}
var myDog = new Dog();

然后当您执行myDog.speak()时,您会收到"Woof woof"的提醒。但我想要的是当你调用myDog.jump()(在类中没有定义)时,你会得到一个默认动作,比如向用户显示一个警告“你试图超越一个不存在的方法”

你知道我该怎么办?

3 个答案:

答案 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只能有一个处理程序;如果你的处理程序被覆盖,这将无法正常工作
  • 它全局捕获TypeErrors,而不仅仅是针对特定对象;即很多误报
  • 调试任何不知道在哪里找到此处理程序的人都会很有趣。
  • 它紧密地耦合了你依赖这种行为的任何代码(坏,坏,坏!)

我认为我没有足够的压力,你应该多少考虑到这个问题。如果可以的话,尽量使用Proxy,如果不能,请承认失败。