我想我可能会在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或者什么?
答案 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。