我正在尝试编写一个javascript类,在需要时加载脚本文件。我有大部分工作。可以使用具有以下语法的库:
var scriptResource = new ScriptResource('location/of/my/script.js');
scriptResource.call('methodName', arg1, arg2);
我想添加一些额外的语法糖,以便你可以写
var scriptResource = new ScriptResource('location/of/my/script.js');
scriptResource.methodName(arg1, arg2);
我几乎可以肯定这是不可能的,但可能有创造性的解决方案。我想有什么需要的是某种methodCall事件。以下可能有效
ScriptResource = function(scriptLocation)
{
this.onMethodCall = function(methodName)
{
this.call(arguments);
}
}
这段代码显然非常不完整,但我希望它能让我知道我想要做什么
这样的东西是否可能远程?
答案 0 :(得分:3)
Firefox中有一种非标准方法,__ noSuchMethod__可以满足您的需求 看看 https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/noSuchMethod
所以你可以定义
obj.__noSuchMethod__ = function( id, args ) {
this[id].apply( this, args );
}
答案 1 :(得分:0)
如果方法名称集有限,那么您可以生成这些方法:
var methods = ["foo", "bar", "baz"];
for (var i=0; i<methods.length; i++) {
var method_name = methods[i];
WildCardMethodHandler[method_name] = function () {
this.handleAllMethods(method_name);
};
}
编辑:在问题发生重大变化之前发布此答案。
答案 2 :(得分:0)
中间解决方案可能是具有以下语法:
var extObj = ScriptResource('location/of/my/script.js');
extObj('methodname')(arg1,arg2);
代码可能如下所示:
function ScriptResource(file) {
return function(method) {
loadExternalScript(file);
return window[method];
}
}
上面代码中的各种假设,我让你自己弄清楚。最有趣的是,恕我直言 - 在您的原始实现中 - 如何让代理方法同步运行并返回值? AFAIK只能异步加载外部脚本并使用“onload”回调处理它们。