【问题标题】:What exactly does var x:* mean in actionscript?var x:* 在 actionscript 中到底是什么意思?
【发布时间】:2010-09-17 11:23:47
【问题描述】:

搜索 'var:*' 有点棘手,因为大多数搜索引擎不会找到它。

与 var:Object 相比,我不清楚 var:* 的确切含义

我认为它可以让我在对象上设置任意属性,例如:

var x:*  = myObject;
x.nonExistantProperty = "123";

但这给了我一个错误:

Property nonExistantProperty not found on x

*到底是什么意思?

编辑:我将原始 var:* 修复为正确的 var x:*。失去了我的互联网连接

【问题讨论】:

    标签: actionscript


    【解决方案1】:

    扩展其他答案,声明带有星号类型的内容完全与不输入类型相同。

    var x:* = {};
    var y = {}; // equivalent
    

    但是,是否允许将不存在的属性分配给对象的问题与引用的类型无关,取决于对象是否是动态类的实例。

    例如,因为 Object 是动态的,而 String 不是:

    var o:Object = {};
    o.foo = 1; // fine
    var a:* = o;
    a.bar = 1; // again, fine
    
    var s:String = "";
    s.foo = 1; // compile-time error
    var b:* = s;
    b.bar = 1; // run-time error
    

    请注意,无论您使用哪种引用,您都可以始终为对象分配新属性。同样,您永远不能为 String 分配新属性,但如果您使用类型化引用,那么编译器会捕捉到这一点,并且对于非类型化引用,编译器不知道 b 是否是动态的,所以运行时发生错误。

    顺便说一下,类型星号的文档参考可以在这里找到:

    http://livedocs.adobe.com/labs/air/1/aslr/specialTypes.html#*

    (标记引擎拒绝链接它,因为有星号。)

    【讨论】:

      【解决方案2】:

      这是一种指定无类型变量的方法,因此您基本上可以为其分配任何类型。代码

      var x:* = oneTypeObject;
      

      创建变量 x 然后将 oneTypeObject 变量分配给它。您可以为其分配完全不同的类型,如下所示:

      var x:* = anotherTypeObject;
      

      但是,您仍然不能随意设置或访问属性;它们必须存在于基础类型中(oneTypeObject 或 anotherTypeObject)。

      这两种类型可能具有相同名称的属性,这意味着您可以在 x 中访问或设置该属性,而无需关心底层类型。

      【讨论】:

        【解决方案3】:

        这是“无类型”类型。它只是意味着变量可以是任何类型。基本上和使用这个效果一样:

        var x = myObject;
        

        【讨论】:

          【解决方案4】:

          表示没有指定类型,可以和任何类型一起使用。但是,您不能在其上设置随机属性。它的行为就像您设置的任何类型。确切的语法是:

          var x:*;
          

          【讨论】:

            【解决方案5】:

            正如他们之前所说,它是无类型的,因此它可以保存任何类型的数据。但是,您不能在操作中这样对待它。例如,这是有效的代码:

            var untyped:* = functionThatReturnsSomeValue();
            

            但如果你再往前走一步,你必须小心,否则你可能会被咬:

            var name:String = untyped.name;
            

            现在,如果该函数返回的对象恰好是一个具有 id 为“name”的字段的对象,那么您就清楚了。但是,除非您确定确实如此,否则最好使用类型化对象。这样,如果你做了一些可能在运行时抛出错误的事情,编译器会提醒你:

            (elsewhere)
            public class TypedObject()
            {
                public var name:String = "";
            }
            
            (and the code at hand)
            var typed:TypedObject = functionThatReturnsTypedObject();
            var name:String = typed.name;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-04-26
              • 2011-06-20
              • 2014-01-06
              • 1970-01-01
              • 1970-01-01
              • 2016-11-12
              相关资源
              最近更新 更多