EasyScript 开发者指南
代理是一种可以直接调用函数的变量类型。通过@运算符可以创建一个代理。,格式是:对象@函数名,示例:
var o = new MyCls();
var p = o@funcName;
p( "abc" ); //等价于o.funcName( "abc" );
EasyScript与其它脚本语言一样,是可以动态调用函数的,似乎可以取代代理直接调用函数,但动态语言的调用有时反而不方便,以下几种情况用代理就更方便
我们来看下面的例子:
function demo(var p)
{
    return p.add();
}
var p = new P();
var q = new Q();
var r = new R();
demo(p);
demo(q);
demo(r);
假设p具有add函数,q只有Add函数,r只有plus函数,他们的函数名不同,但功能完全相同。这种情况下只有传demo(p)才能正常调用,demo(q)和demo(r)均不能正常调用。如果将来维护代码时p的add函数被改名了,则demo函数也不能正常工作了。而如果demo函数改用代理来实现,代理是名称无关的,可避免此问题,具有更好的代码灵活性。
function demo(var addDelegate)
{
    return addDelegate();
}
var p = new P();
var q = new Q();
var r = new R();
demo(p@add);
demo(q@Add);
demo(r@plus);
代理使得动态语言在一定程度上也具有像静态语言的严谨性。使用代码可以确保demo的入参在语义上是个代理类型,不需要做无谓的类型判断。对比一下:
使用代理
1. 调用者确保传入代理类型
2. demo内部不判断入参类型
不使用代理
1. 调用者确保传入对象类型
2. demo内部判断类型,必须是对象类型并且有add方法
对比可以发现,使用代码虽然无法象静态类型那样严谨程度,但也更好地提高了代码鲁棒性。