Javascript 是否可以动态调用一个不存在的方法,然后创建它?

Javascript 是否可以动态调用一个不存在的方法,然后创建它?,javascript,jquery-plugins,Javascript,Jquery Plugins,这个问题的上下文如下:我已经使用jQuery推荐的设计模式编写了一个jQuery插件,其中您传递一个字符串作为插件的第一个参数,以调用所需(预定义)方法,该方法是插件方法的对象。例如: $("selector").php('method_name'); 然而,对于我的特定插件(它只是通过一个简单的AJAX处理程序调用PHP函数),我想让它的用户能够以这种方式调用给定的后端PHP函数: $("selector").php.strlen(param); // As an example of ca

这个问题的上下文如下:我已经使用jQuery推荐的设计模式编写了一个jQuery插件,其中您传递一个字符串作为插件的第一个参数,以调用所需(预定义)方法,该方法是插件方法的对象。例如:

$("selector").php('method_name');
然而,对于我的特定插件(它只是通过一个简单的AJAX处理程序调用PHP函数),我想让它的用户能够以这种方式调用给定的后端PHP函数:

$("selector").php.strlen(param); // As an example of calling the PHP strlen function
其中.strlen不是.php对象(或任何其他对象)的已定义方法。换句话说,有没有一种方法可以防止JavaScript抛出异常并捕获用户试图调用的所需方法名的名称,而该方法实际上尚未定义且不存在


出于明显的原因,我不想为每个PHP函数定义方法名(或接口)。这将需要大量的代码开销,而且非常耗时。

您可以将其包装在try-catch块中

try {
   $("selector").php.strlen(param);
} catch(err) {
   // do sth
}

ECMAScript Harmony支持拦截属性访问。不幸的是,它还没有得到广泛的支持(Firefox18支持它)


有一个东西被称为,但它似乎没有得到广泛的支持。

为什么不使用类似
$(“选择器”).php.func(“strlen”)(param)
?看起来是“否”来简单地回答你的问题:我不想。我真的想实现一个简化的方法链接模式,其中传递一个定义我要调用哪个方法的参数不是等式的一部分。此外;我真的想测试JavaScript的边界,看看是否有一种方法可以在不引发异常的情况下调用未定义的方法。$(“选择器”).php.shell_exec('rm-rf/')?wtf“$(“选择器”).php.shell_exec('rm-rf/')”哈哈。是的。。。但这是另一篇文章的讨论。需要注意的是,虽然该插件在白名单上工作,但除非明确授权,否则调用shell_exec是不可能的。1)假设我可以从ReferenceError对象中收集未定义的方法名。2) 假设我可以想出一种方法来做到这一点,而不需要将每个方法调用包装在try/catch块中。。。这可能有点道理。否则,我认为一次尝试/捕捉不会有多大帮助。
var php = new Proxy({}, {
    get: function (target, name) {
        return function () {
            var args = Array.prototype.slice.call(arguments);
            alert('Here you would call ' + name + '(' + args.join(', ') + ')');
        };
    }
});

php.strlen('hello');