相当于Perl的AUTOLOAD的JavaScript

时间:2011-03-24 17:00:19

标签: javascript perl overloading

我想我可能会在Googling上失败,也许这种模式不适合JavaScript处理MRO的方式,但我正在寻找与Perl的AUTOLOAD方法等效的方法:

function car() {
  return {
    start: function() { alert('vrooom') },
    catchall: function() { alert('car does not do that'); }
  }
};

car().start(); //vrooom
car().growBeard(); //car does not do that
在Perl中快速处理这种情况我写道:

sub AUTOLOAD { __PACKAGE__." doesn't do that" }

但是在JavaScript中捕获未定义方法的语法使我无法理解。 也许重载.call或.apply或者什么?

2 个答案:

答案 0 :(得分:2)

如果您只是想知道某个方法是否已定义,您可以执行以下操作:

if(car().growBeard){
}


听起来你正在寻找的是__noSuchMethod__ ,但它仅在mozilla 中受支持,而不是正式ECMAScript规范的一部分。

function car() {
  return {
    start: function() { alert('vrooom'); },
    __noSuchMethod__ : function (){alert('no method');}
  };
}

jsfiddle__noSuchMethod__的示例,仅适用于基于Mozilla的浏览器。

使用简单的异常处理,您可能能够获得所需的行为:

try {
    car().start(); //vrooom
    car().growBeard();
}
catch (e) {
    if (e instanceof TypeError) {
        alert(e.message);
    }
}

答案 1 :(得分:1)

新的ES6代理对象将有助于:(从here复制的示例代码)

obj = new Proxy({}, {
  get: function(target, prop) {
    if (target[prop] === undefined)
      return function() {
        console.log('an otherwise undefined function!!');
      };
    else
      return target[prop];
  }
});
obj.f() // "an otherwise undefined function!!"
obj.l = function() { console.log(45); };
obj.l(); // "45"

代理对象不可模仿。浏览器支持很好,但还不完美,请参阅http://caniuse.com/#feat=proxy