2

我正在尝试编写一个 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);
    }
}

这段代码显然非常不完整,但我希望它能让我了解我想要做什么

像这样的事情还有可能吗?

4

3 回答 3

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 );
}
于 2009-01-09T11:35:26.727 回答
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);
    };
}

编辑:在问题发生巨大变化之前发布了这个答案。

于 2009-01-09T11:23:19.247 回答
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”回调处理它们。

于 2009-02-25T20:35:24.350 回答