Coldfusion代理混淆

Coldfusion代理混淆,coldfusion,Coldfusion,我正在coldfusion组件中使用代理/委托模式,并且(从我的角度)得到了意外的结果。下面是我的代理组件——非常简单,我只是用我想委托给的实际组件初始化CFC,然后将命名函数从该CFC映射到代理函数(本例简化了下面的内容) 我创建了一个代理组件,如下所示: component output="false"{ /** Constructor for proxy - requires an instance of myFusebox **/ public MyFuseboxPro

我正在coldfusion组件中使用代理/委托模式,并且(从我的角度)得到了意外的结果。下面是我的代理组件——非常简单,我只是用我想委托给的实际组件初始化CFC,然后将命名函数从该CFC映射到代理函数(本例简化了下面的内容)

我创建了一个代理组件,如下所示:

component output="false"{

    /** Constructor for proxy - requires an instance of myFusebox **/
    public MyFuseboxProxy function init( Required any myFb ){
        variables.myFusebox = arguments.myFb;
        return this;
    }

    this.do = variables.proxy;
    this.getApplication = variables.proxy;
    this.getApplicationData = variables.proxy;

    private any function proxy(){    
        var local.functionName = getFunctionCalledName();
        var local.function = variables.myFusebox[local.functionName];
        var local.returnVal = local.function( argumentCollection=arguments );

        return local.returnVal;
    }
}
<cffunction name="getApplicationData" returntype="struct" access="public" output="false"
            hint="I am a convenience method to return a reference to the application data cache.">
    <cfreturn getApplication().getApplicationData() />
</cffunction>
从我的应用程序中,我调用以下代码:

    variables.myFusebox = new ab.MyFuseboxProxy( variables.myFusebox );
    variables.myFusebox.getApplicationData().startTime = now();
现在,在上面的场景中,我希望我的代理组件将getApplicationData()函数直接映射到原始的myFusebox组件(通过我的
proxy()
函数)

基础组件中的功能如下所示:

component output="false"{

    /** Constructor for proxy - requires an instance of myFusebox **/
    public MyFuseboxProxy function init( Required any myFb ){
        variables.myFusebox = arguments.myFb;
        return this;
    }

    this.do = variables.proxy;
    this.getApplication = variables.proxy;
    this.getApplicationData = variables.proxy;

    private any function proxy(){    
        var local.functionName = getFunctionCalledName();
        var local.function = variables.myFusebox[local.functionName];
        var local.returnVal = local.function( argumentCollection=arguments );

        return local.returnVal;
    }
}
<cffunction name="getApplicationData" returntype="struct" access="public" output="false"
            hint="I am a convenience method to return a reference to the application data cache.">
    <cfreturn getApplication().getApplicationData() />
</cffunction>
如果我在该函数中转储“
this
”,它实际上会转储我的代理对象


有人能解释一下我做错了什么吗?我希望一旦函数调用在底层对象中,它就可以从那里使用自己的上下文(我的代理只是传递给代理)

我认为这是关键点:

我希望一旦函数调用进入底层 反对

你有这个:

private any function proxy(){    
    var local.functionName = getFunctionCalledName();
    var local.function = variables.myFusebox[local.functionName];
    var local.returnVal = local.function( argumentCollection=arguments );

    return local.returnVal;
}
当你这样做的时候:

var local.function = variables.myFusebox[local.functionName];
您正在有效地将
local.functionName
引用的函数从
variables.myFusebox
中提取出来,并将其放入当前函数中,在
MyFuseboxProxy
实例的上下文中

所以当你这样做的时候:

var local.returnVal = local.function( argumentCollection=arguments );
您没有运行
variables.myFusebox[local.functionName]()
(因此在
variables.myFusebox
的上下文中),但您正在运行
local.function()
(因此在代理对象的上下文中)

我没有耐心尝试遵循你的逻辑,但我仍然很惊讶你会犯这样的错误。我本以为会发生这种情况:

  • local.function
    (从
    variables.myFusebox
    引用
    getApplicationData
    )运行
    getApplication()
  • getApplication()
    MyFuseboxProxy
    实例的上下文中,应该是对
    variables.proxy()的引用
  • variables.proxy()
    将代理函数解析为
    getApplication()
    ,并从
    variables.myFusebox
    中提取该函数,并在
    MyFuseboxProxy
    实例的上下文中运行它
  • 您没有包含来自
    variables.myFusebox
    getApplication()
    函数的代码,因此我不知道接下来会发生什么,但这不是您希望发生的
  • 无论如何,我认为关键在于,不是在
    variables.myFusebox
    中运行函数,而是在
    MyFuseboxProxy
    实例中运行它们。如果要执行这种代理(暂时忽略专门用于执行此操作的
    invoke()
    ),则仍然需要在其原始上下文中调用函数,而不是在某些新上下文中引用它

    我猜你这么胡闹是因为ColdFusion不喜欢这种语法:

    someObject[someMethodName]()
    
    它在
    []()
    表示法处阻塞。然而,解决方案并非如此:

    someOutOfContextReference=someObject[someMethodName] 结果=someOutOfContextReference()

    是这样的:

    someObject.someInContextReference=someObject[someMethodName] 结果=someObject.someInContextReference()

    看到细微的差别了吗


    ColdFusion函数不是本质上的闭包,这正是您需要它们以您想要的方式工作的地方。

    我认为这是关键点:

    我希望一旦函数调用进入底层 反对

    你有这个:

    private any function proxy(){    
        var local.functionName = getFunctionCalledName();
        var local.function = variables.myFusebox[local.functionName];
        var local.returnVal = local.function( argumentCollection=arguments );
    
        return local.returnVal;
    }
    
    当你这样做的时候:

    var local.function = variables.myFusebox[local.functionName];
    
    您正在有效地将
    local.functionName
    引用的函数从
    variables.myFusebox
    中提取出来,并将其放入当前函数中,在
    MyFuseboxProxy
    实例的上下文中

    所以当你这样做的时候:

    var local.returnVal = local.function( argumentCollection=arguments );
    
    您没有运行
    variables.myFusebox[local.functionName]()
    (因此在
    variables.myFusebox
    的上下文中),但您正在运行
    local.function()
    (因此在代理对象的上下文中)

    我没有耐心尝试遵循你的逻辑,但我仍然很惊讶你会犯这样的错误。我本以为会发生这种情况:

  • local.function
    (从
    variables.myFusebox
    引用
    getApplicationData
    )运行
    getApplication()
  • getApplication()
    MyFuseboxProxy
    实例的上下文中,应该是对
    variables.proxy()的引用
  • variables.proxy()
    将代理函数解析为
    getApplication()
    ,并从
    variables.myFusebox
    中提取该函数,并在
    MyFuseboxProxy
    实例的上下文中运行它
  • 您没有包含来自
    variables.myFusebox
    getApplication()
    函数的代码,因此我不知道接下来会发生什么,但这不是您希望发生的
  • 无论如何,我认为关键在于,不是在
    variables.myFusebox
    中运行函数,而是在
    MyFuseboxProxy
    实例中运行它们。如果要执行这种代理(暂时忽略专门用于执行此操作的
    invoke()
    ),则仍然需要在其原始上下文中调用函数,而不是在某些新上下文中引用它

    我猜你这么胡闹是因为ColdFusion不喜欢这种语法:

    someObject[someMethodName]()
    
    它在
    []()
    表示法处阻塞。然而,解决方案并非如此:

    someOutOfContextReference=someObject[someMethodName] 结果=someOutOfContextReference()

    是这样的: