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