JavaScript 相当于 Perl 的 AUTOLOAD

发布于 2024-10-26 17:55:57 字数 488 浏览 4 评论 0原文

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

I think I might fail at Googling, and maybe this pattern just doesn't fit with the way JavaScript handles MRO, but I'm looking for an equivalent to Perl's AUTOLOAD method such that:

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

in Perl to quickly handle this situation I'd write:

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

but the syntax to catch an undefined method in JavaScript eludes me.
Perhaps overloading .call or .apply or something?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

云仙小弟 2024-11-02 17:55:57

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

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

If you simply want to know if a method is defined you can do the following:

if(car().growBeard){
}

It sounds like what you are looking for is __noSuchMethod__, however it is only supported in mozilla, and not part of the formal ECMAScript specifications.

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

Example of __noSuchMethod__ on jsfiddle, only works in a mozilla based browser.

Using simple exception handling you might be able to get your desired behavior:

try {
    car().start(); //vrooom
    car().growBeard();
}
catch (e) {
    if (e instanceof TypeError) {
        alert(e.message);
    }
}
静若繁花 2024-11-02 17:55:57

新的 ES6 代理对象将有所帮助:(从此处复制的示例代码)

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。

The newish ES6 Proxy object will help: (sample code copied from 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"

Proxy objects are unshimmable. Browser support is good, but not perfect yet, see http://caniuse.com/#feat=proxy.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文