【问题标题】:Why is this code throwing ReferenceError #1069?为什么这段代码会抛出 ReferenceError #1069?
【发布时间】:2011-02-15 17:36:25
【问题描述】:

此代码的第一行抛出 ReferenceError #1069。 “在 ObjectButtonSkin 上找不到属性 focusMask,并且没有默认值。” “皮肤”变量是 MovieClip 类型,而实际对象实例是 ObjectButtonSkin 类型(它扩展了 MovieClip)。

if (skin["focusMask"] != null)
    if (skin["focusMask"] is DisplayObject)
        (skin["focusMask"] as DisplayObject).visible = false;

这从来都不是问题,所以我不确定为什么会这样。 ObjectButtonSkin 类没有被标记为动态或其他任何东西,所以也许这就是问题所在?一个网站建议我应该使用“()”而不是“[]”来访问该属性,但这似乎不对。

【问题讨论】:

    标签: flash actionscript-3 indexed-properties referenceerror


    【解决方案1】:

    对是否存在 focusMask 的更好检查是:

    if (skin.hasOwnProperty("focusMask") && skin.focusMask!=null)...
    

    或者,如果你想更干净,你应该将 focusMask 提取到一个变量中:

    var focusMask:DisplayObject = skin.getChildByName("focusMask");
    if (focusMask)
        focusMask.visible = false;
    

    【讨论】:

    • 我运行了一些测试,只有当类没有被标记为动态时,属性访问运算符 [] 才会抛出异常。 MovieClip 和 Object 是动态的,但扩展 MovieClip 的类不是动态的,除非明确标记为动态。 hasOwnProperty 是 Object 的一个方法,在这种情况下可以工作,尽管它不会根据文档检测原型属性。
    • 只有当 focusMask 实际上是 skin 的子级并且其“name”属性设置为“focusMask”时,getChildByName 替代方案才有效,但在这种情况下并非如此。同样有趣的是...如果多个子剪辑具有相同的名称,则 getChildByName 返回子列表中的第一个。
    • 啊,focusMask 是不是对我来说是模棱两可的。
    • 实际上,在这种情况下它可能会起作用。 Flash IDE 会为命名实例自动设置对象的“名称”属性;但是,动态附加的子项不一定具有其 name 属性集,并且它不等同于它恰好被分配到的类实例属性名称。例如,类实例“human”,其属性“arm”引用代表手臂的子剪辑,可以作为human[“arm”]访问,但不会被human.getChildByName(“arm”)找到,除非human["arm"]["name"] 设置为 "arm"。只是对其他读者的澄清。
    猜你喜欢
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多