Coldfusion - Overriding tag based functions that use keywords
我目前正在尝试扩展第三方 CFC,一切正常且工作正常,但是,我现在开始覆盖 CFC 中的一个方法(我首先扩展它的全部原因) .现在第三方 CFC 都是基于标签的,并且有一个名为"do"的函数 - 定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 | <cffunction name="do" returntype="any" access="public" output="true" hint="I compile and execute a specific fuseaction."> <cfargument name="action" type="string" required="true" hint="I am the full name of the requested fuseaction (circuit.fuseaction)." /> <cfargument name="contentVariable" type="string" default="" hint="I indicate an attributes / event scope variable in which to store the output." /> <cfargument name="returnOutput" type="boolean" default="false" hint="I indicate whether to display output (false - default) or return the output (true)." /> <cfargument name="append" type="boolean" default="false" hint="I indicate whether to append output (false - default) to the content variable." /> <cfargument name="passThroughReturn" type="boolean" default="false" hint="I indicate whether to allow for a return to be passed through from an action CFC." /> |
现在,我的 CFC 都是 cfscript(我个人的偏好
不幸的是,我认为没有什么好方法可以实现您想要的。但是,有一些解决方法。一个技巧是这样做:
1 2 3 4 5 6 7 | component extends="OriginalComponent" { variables["do"] = function () { // new function code here }; this["do"] = variables["do"]; } |
它实际上并没有覆盖传统意义上的函数,但它似乎可以工作:在测试时,对函数的内部和外部调用都称为新函数,而不是原来的函数。
我不知道这种黑客攻击可能会产生其他后果,所以要小心。
如果您真的不能使用 CFML,如果您的新 cfc 不需要进行类型检查,并且您不需要访问父级的私有变量,这可能会起作用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | component { function init(parent) { variables.parent = parent; return this; } function onMissingMethod(missingMethodName, missingMethodArguments) { if (missingMethodName =="do") doFunc(); else { // if CF10, use invoke(), else use yucky evaluate() } } function doFunc() { // your new do() function } } |