使用onMissingMethod无法访问对象变量

时间:2015-04-29 18:04:51

标签: coldfusion coldfusion-10 railo

在CF10中,我想使用TestHelper对象中的onMissingMethod函数访问变量Test对象,但是我收到错误。

Test.cfc

component  {

public Any function init(){
    instance = { x = 1 };
    return this;
}

public numeric function getX(){

    return instance.x;

}

}

TestHelper.cfc

component  {

public Any function init( ){
    variables.testObj = new Test();
    return this;
}

public any function onMissingMethod( required string missingMethodName, required struct missingMethodArguments ){

    var func = variables.testObj[ arguments.missingMethodName ];
    return func( argumentCollection = arguments.missingMethodArguments );

}

}

调用对象

obj = new TestHelper();
writeOutput( obj.getX() );  //Element INSTANCE.X is undefined in VARIABLES

在CF10中,这给了我一个错误,即元素X在实例中是未定义的。它似乎无法识别变量实例。我可以在TestHelper中明确定义getX函数,但我希望我可以使用onMissingMethod函数。

我是否误解了onMissingMethod应该如何在这里工作? FWIW,该代码适用于Railo。

1 个答案:

答案 0 :(得分:2)

如果我理解你的问题,我很惊讶这个代码在Railo上运行。我认为不应该。

问题在于此代码:

var func = variables.testObj[ arguments.missingMethodName ];
return func( argumentCollection = arguments.missingMethodArguments );

您要从[{1}}中提取函数getX(),并在variables.testObj实例的上下文中运行它。而且这个对象没有`variables.x。因此错误。

您需要将TestHelper引用放入func,而不是将variables.testObj拉出来。像这样:

getX

这样您就可以在正确的上下文中运行var variables.testObj.func = variables.testObj[ arguments.missingMethodName ]; return variables.testObj.func( argumentCollection = arguments.missingMethodArguments ); (代理到func()),因此会看到getX()

鉴于这种情况,此代码无法在Railo上运行(根据您提供给我们所有相关信息的信息,无论如何)。