当尝试在未定义的对象上调用方法时,有没有办法使JavaScript无声地失败?

max*_*son 2 javascript oop error-handling undefined

我不想检查一个对象是否被定义,而是希望能够简单地在其上调用一个方法,并且如果该对象实际上是未定义的,则让它无声地失败.所以,而不是必须写下面的内容:

if(obj.delegate && obj.delegate.closeMenu){
    obj.delegate.closeMenu();
}
Run Code Online (Sandbox Code Playgroud)

我可以在if声明中写下这句话:obj.delegate.closeMenu().如果obj没有委托属性,就不会发生任何事情.如果delegate存在同样的事情,但它没有closeMenu()方法.

这可能吗?如果是,请提供实施.

Mat*_*ens 5

目前没有可靠的方法来做到这一点,而无需编写更多代码.您可以使用try- catch,例如:

try {
  obj.delegate.closeMenu();
} catch(e) {
  // fail silently
}
Run Code Online (Sandbox Code Playgroud)

请注意,非标准__noSuchMethod__可以满足您的需求,但并不是所有地方都支持.


更新:在ES6中,您可以使用代理执行类似的操作.例如:

function getProperty(target, name, receiver) {
  if (name in target) {
    return target[name];
  }
  // property does not exist
  var result = doSomethingElse();
  return result;
}

var object = return Proxy(something, {
  'get': getProperty
});
Run Code Online (Sandbox Code Playgroud)

  • `__noSuchMethod__`只能拦截对函数**的**调用.它不适用于属性.当`__noSuchMethod__`在`a`上正确实现时,`abc()`仍会抛出错误,但是`ab().c()`不会. (2认同)