delete
在 AS3 中,如果一个类被标记为动态的,则可以在运行时添加和删除新属性,只需使用关键字设置或删除属性即可。
我在问是否有比调用describeType
函数并检查返回的顶级 XML 节点上的“isDynamic”属性值更快的方法来确定一个类是否是动态的,例如:<type name="flash.display::MovieClip" base="Class" isDynamic="true" isFinal="true" isStatic="true">
.
我怀疑有一种更快的方法,但我真正需要做的就是尝试分配一个属性值(如果它存在或可以创建)。
//The "base is dynamic" test is pseudo-code since it's not valid
if (base.hasOwnProperty(propertyName) || (base is dynamic))
base[propertyName] = value;
else
throw new Error( "Property " + propertyName + " does not exist and cannot be created." );
也许我最好将分配包装在 try/catch 块中,并假设分配失败时类不是动态的。如果成功,我不在乎它是否是动态的,因为目标是简单地分配属性值(如果存在或可以添加)。
try{base[propertyName] = value}catch(err:Error){/*property did not exist and class is not dynamic, or some other error occurred in the property setter*/}
我对 try/catch 方法的唯一问题是我不知道分配是否失败,因为无法分配属性,或者属性设置器中是否发生了其他错误。即使捕获错误并检查其类型也不会告诉我错误是否发生在这个精确的点(与此设置器调用链中的其他设置器相反),因为 getStackTrace 方法仅在调试播放器中可用。这就是为什么我真的需要预先检查该类是否是动态的,以便可以可靠地预测并完全避免分配失败。我将选择正确的实现而不是更快的实现。