如何在flash AS3中动态调用带有参数的setter方法

时间:2011-07-04 10:55:27

标签: actionscript-3 function-calls

此AS3功能适用于常规方法和getter方法:

   public function MyClassTestAPI(functionName:String, ...rest):* {
    var value:*;            
        try {
            switch(rest.length) {
                case 0:
                    value = myObj[functionName];
                    break;
                case 1:
                    value = myObj[functionName].call(functionName, rest[0]);
                    break;
                case 2:
                    value = myObj[functionName].call(functionName, rest[0],rest[1]);
                    break;
                default:
                    throw("Cannot pass more than 2 parameters (passed " + rest.length + ")");
            }                
        } 
        return value;                
    }

样本用法:

this.MyClassTestAPI("Foo", "arg1"); // tests function Foo(arg1:String):String
this.MyClassTestAPI("MyProperty");  // tests function get MyProperty():String
this.MyClassTestAPI("MyProperty", "new value");// tests function set MyProperty(val:String):void

第三个调用不起作用(抛出异常)。 我怎样才能使它适用于setter方法呢? 谢谢!

编辑:
这是一个有效的版本,除了具有附加参数的getter和setter。 它可以满足我的需求:

   public function MyClassTestAPI(functionName:String, ...rest):* {
    var value:*;            
        try {
            if (typeof(this.mediaPlayer[functionName]) == 'function') {
                switch(rest.length) {
                case 0:
                    value = myObj[functionName].call(functionName);
                    break;
                case 1:
                    value = myObj[functionName].call(functionName, rest[0]);
                    break;
                case 2:
                    value = myObj[functionName].call(functionName, rest[0],rest[1]);
                    break;
                default:
                    throw("Cannot pass more than 2 parameters (passed " + rest.length + ")");
                }                
            }  else {
                switch(rest.length) {
                case 0:
                    value = myObj[functionName];
                    break;
                case 1:
                    myObj[functionName] = rest[0];
                    break;
                default:
                    throw("Cannot pass parameter to getter or more than one parameter to setter (passed " + rest.length + ")");
               }                
            }
        } 
        return value;                
    }

2 个答案:

答案 0 :(得分:1)

Setter函数用作变量,因此您不能以这种方式使用它:

    myProperty.call( "new value" );

您对变量的函数毫无意义,因为您只需要进行值赋值:

    myProperty = "new value";

顺便说一下,你可以通过两种方式将它包含在你的函数中:

  1. 创建第三个参数,告诉你的函数它是一个函数或变量
  2. 在catch部分创建值赋值

答案 1 :(得分:0)

您当前只传递一个值为“new value”的字符串

这应该可以解决问题:

this.MyClassTestAPI("MyProperty", "new","value");

有关此事项的更多信息,请访问Adobe LiveDocs: http://livedocs.adobe.com/flex/3/html/help.html?content=03_Language_and_Syntax_19.html

干杯