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

发布于 2024-11-18 06:23:32 字数 2484 浏览 2 评论 0原文

此 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;                
    }

This AS3 function works for normal methods and getter methods:

   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;                
    }

Sample usage:

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

The third call does not work (throws exception).
How can I make it work for setter methods as well?
Thanks!

edit:
This is a version that works, except with getter and setter that have additional parameters.
It is ok for my needs:

   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;                
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

拍不死你 2024-11-25 06:23:32

Setter 函数作为变量工作,所以你不能以这种方式使用它:

    myProperty.call( "new value" );

你的变量函数是没有意义的,因为你只需要进行赋值:

    myProperty = "new value";

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

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

Setter functions works as variables, so you can't use it in this way:

    myProperty.call( "new value" );

Your function for variables is pointless, because you just have to do a value assignment:

    myProperty = "new value";

By the way you can include it in your function in two ways:

  1. create a third parameter what tells your function it is a function or variable
  2. create the value assignment in the catch section
手心的海 2024-11-25 06:23:32

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

这应该可以解决问题:

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

有关此问题的更多信息,请查看 Adob​​e LiveDocs:
http://livedocs.adobe.com/flex/3 /html/help.html?content=03_Language_and_Syntax_19.html

干杯

You are currently passing only one string with value "new value"

This should do the trick:

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

For more information on this matter check the Adobe LiveDocs at:
http://livedocs.adobe.com/flex/3/html/help.html?content=03_Language_and_Syntax_19.html

Cheers

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文