代码之家  ›  专栏  ›  技术社区  ›  Thom Smith

用显式接收器调用ColdFusion方法

  •  1
  • Thom Smith  · 技术社区  · 6 年前

    我想用ColdFusion写一个混合词。

    例如mixin.cfc:

    component {
        remote void function mixin(component, methodName) {
            var original = component[methodName];
            component[methodName] = function() {
                writeOutput("Mixin!");
                return original(arguments);
            };
        }
    }
    

    试验cfc:

    component {
        new ExampleMixin().mixin(this, 'foo');
    
        remote string function foo() {
            return getOutput();
        }
    
        private string function getOutput() {
            return "Hello, World!";
        }
    }
    

    跑步 foo 产生错误, Variable GETOUTPUT is undefined. new ExampleMixin().mixin(this, 'foo'); ,运行良好。

    好像什么时候 foo.call(component, ...arguments)

    1 回复  |  直到 6 年前
        1
  •  1
  •   Robert    6 年前

    ColdFusion使用 this variables 存储函数的作用域 参考文献。所使用的引用取决于函数的调用方式。如果 该函数是从一个同级调用的 变量 引用。如果 引用。

    $mixin 原始函数。我正在为原始函数和 mixin函数,以便可以在两个作用域中设置引用。

    这在Lucee 5.2.8.50上进行了测试。

    component {
        function $mixin(obj) {
            var meta = getComponentMetadata(obj);
    
            for(var func in meta.functions) {
                if(structKeyExists(this, func.name)) {
                    var orig = func.name & replace(createUUID(), '-', '', 'all');
                    var injected = func.name & replace(createUUID(), '-', '', 'all');
    
                    this[orig] = this[func.name];
                    variables[orig] = this[func.name];
    
                    this[injected] = obj[func.name];
                    variables[injected] = obj[func.name];
    
                    var wrapper = function() {
                        this[injected](argumentCollection=arguments);
                        return this[orig](argumentCollection=arguments);
                    };
                    this[func.name] = wrapper;
                    variables[func.name] = wrapper;
                } else {
                    this[func.name] = obj[func.name];
                    return variables[func.name] = obj[func.name];
                }
            }
        }
    }
    

    测试.cfc

    component extends="mixable" {
        remote function foo() {
            writeOutput("foo(), calling bar()<br>");
            bar();
        }
    
        private function bar() {
            writeOutput("bar()<br>");
        }
    }
    

    混合.cfc

    component {
        function foo() {
            writeOutput("foo mixin, calling bar()<br>");
            bar();
        }
    
        function myfunc() {
            writeOutput("myfunc()<br>");
        }
    }
    

    索引.cfm

    <cfscript>
    t = new test();
    t.$mixin(new mixin());
    t.myfunc();
    t.foo();
    </cfscript>
    

    输出

    myfunc()
    foo mixin, calling bar()
    bar()
    foo(), calling bar()
    bar()