AS3无法识别我刚刚声明的变量

时间:2015-04-23 04:12:29

标签: actionscript-3 flash oop

我正在尝试加载背景图片,但我收到错误消息“错误:访问未定义的属性assetLoader”。这是怎么回事?

import flash.display.Loader;
import flash.net.URLRequest;
class Inventory {
    private var assetLoader:Loader = new Loader();
    assetLoader.load(new URLRequest("image.png")); //error on this line
    addChild(assetLoader);
}

3 个答案:

答案 0 :(得分:3)

  1. 如果您使用addChild()方法,则必须继承DisplayObjectContainer的功能。如果您将Inventory课程用作document课程,则必须延长SpriteMovieClip

  2. 文档类必须由公共访问说明符定义。

  3. 只允许全局(类属性定义)声明的变量使用privatepublic。您不能在本地使用它(在函数内)。时间轴也不允许您使用访问说明符。

    package 
    {
       import flash.display.Loader;
       import flash.net.URLRequest; 
       import flash.display.MovieClip;
    
       public class Inventory extends MovieClip 
       {
            private var assetLoader:Loader;
            public function Inventory() 
            {
                // constructor code
                assetLoader= new Loader();
                assetLoader.load(new URLRequest("image.png")); //error on this line
                addChild(assetLoader);
            }
       }
    }
    

答案 1 :(得分:2)

您需要将这两行放在构造函数代码中,如下所示:

import flash.display.Loader;
import flash.net.URLRequest;
class Inventory {
    private var assetLoader:Loader = new Loader();
    public function Inventory() {
        assetLoader.load(new URLRequest("image.png")); //error on this line
        addChild(assetLoader);
    }
}

答案 2 :(得分:1)

正确的答案是,即使很难,您也可以在声明时将实例化实例化,如下所示:

private var assetLoader:Loader = new Loader();

在类实例存在之前,不允许使用这些对象。在创建Inventory实例之前访问assetLoader属性和方法的任何尝试都将失败。构造函数是Inventory的一个实例将运行的第一段代码,因此它是类代码中的第一个可以开始使用类实例对象的位置,因为此时Inventory实例存在。 Vesper代码示例正确显示它。

理论上这个:

private var assetLoader:Loader;

public function Inventory()
{
    assetLoader = new Loader();
}

相当于:

class urlencodeSerializer(Serializer):
formats = ['json', 'jsonp', 'xml', 'yaml', 'html', 'plist', 'urlencode']
content_types = {
    'json': 'application/json',
    'jsonp': 'text/javascript',
    'xml': 'application/xml',
    'yaml': 'text/yaml',
    'html': 'text/html',
    'plist': 'application/x-plist',
    'urlencode': 'application/x-www-form-urlencoded',
    }
def from_urlencode(self, data,options=None):
    """ handles basic formencoded url posts """
    qs = dict((k, v if len(v)>1 else v[0] )
    for k, v in urlparse.parse_qs(data).iteritems())
    return qs

def to_urlencode(self,content):
    pass

但实际上assetLoader创建的时间略有不同。在构造函数中创建这些成员实例总是更好。

To Benny:所有类都有一个默认为internal的访问修饰符。 PO类被定义为内部,因此具有正确的访问修饰符(内部默认值,因为没有指定)。成员变量的访问修饰符已正确定义,与PO问题无关。