【问题标题】:JavaScript equivalent of Perl's AUTOLOADJavaScript 等价于 Perl 的 AUTOLOAD
【发布时间】:2011-03-24 17:00:18
【问题描述】:

我想我在谷歌上搜索可能会失败,也许这种模式不适合 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 之类的?

【问题讨论】:

    标签: javascript perl overloading


    【解决方案1】:

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

    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);
        }
    }
    

    【讨论】:

    • 我正在尝试处理我不知道可以调用什么方法的情况。最终,我希望根据方法的名称来设置包罗万象的方法。也就是说, car().color('red') 可能会设置 car.color='red'
    • 谢谢马克,如果它是标准的,那将是正确的票。希望有另一条路线可能与大多数浏览器兼容的异常处理。
    • @nebulous,我使用简单的try{}catch{}添加了一个示例
    • 标记为已回答,因为大多数情况下 noSuchMethod 是我正在寻找的。不幸的是,这个 try/catch 示例需要在每次调用 car() 时都进行 try/catch,而不是在 car() 中定义。我想我只是太懒了,想要的东西太动态了。 Perl 宠坏了我的其他语言。
    【解决方案2】:

    新的 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 2023-04-11
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      相关资源
      最近更新 更多