我的代码如下所示:
obj.foo(); // obj might, or might not have a `foo` method.
我想知道我是否可以覆盖发生的情况obj.foo
在我的代码中被调用,例如:
obj.foo = function(){ alert ("Hello"); });
obj.onCallNonExistentMethod = function(){ // I know this is imaginary syntax
alert("World");
}
obj.foo(); // alerts "Hello"
delete obj.foo;
obj.foo(); // alerts "World" , would TypeError without the method missing handler.
据我了解,在 Ruby 中这将是method_missing
or const_missing
或类似的东西。
我可以重写在 JavaScript 中调用不存在的对象方法时发生的情况吗?如果可以的话我该怎么做?
目标是验证我向用户提供的 API,以便他们可以安全地使用该 API,并且我可以更清楚地警告他们错误。
两年前,本杰明,你还不太了解行为类型的概念,是吗?
你很幸运,你很快就会意识到接口不是结构化的自从写这个问题以来,在 JavaScript 中,甚至写了一个库这解决了您在这里所说的确切问题,只是永远不要使用它。
所以,回答你的问题:
- 是的,这是完全有可能做到的。
- 对于您给出的情况,您可能不应该这样做。
怎么做
如果您只需要通过以下方式支持非常非常(非常非常)的新浏览器,那么这是完全可行的代理API.
var realObject = { foo: function(){ alert("Bar"); }); // our fooable api
var api = new Proxy({}, {
get: function(target, name){
if(name in target){ // normal API call
return target[name];
}
// return whatever you want instead of the method:
return function(){ alert("Baz"); });
}
});
api.foo(); //alerts Bar
api.bar(); //alerts Baz
api.IWillNotBuyThisRecordItIsScratched(); // alerts Baz
因此,虽然浏览器支持非常不稳定,但
为什么你不应该
接口传达行为,上面的情况(例如拼写错误)通常可以(并且应该)被 jshint 或 ternjs 等静态分析工具捕获。
检查拼写错误的工具根本不足以传达 JavaScript 中的行为,类型检查通常被认为是一种反模式 - 在 JavaScript、Ruby 和 Python 等语言中,您知道将获得的类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)