2010-06-25 131 views
0

我试图将对象的属性作为另一个对象的实际属性。ActionScript设置来自其他对象属性的对象属性?

这里是我的对象变量:

var propObj:Object = {prop:"width", width:50}; 

现在我要分配使用该对象的属性精灵的属性。

var sp:Sprite = new Sprite(); 
sp.(propObj.prop as Sprite.property) = propObj.width; 

现在,我甚至不会去尝试,因为我知道编译器会在我的脸上爆炸。但你应该能够看到我想要做的事情。

为什么我试图这样做是因为我正在阅读XML文件,其中包含特定对象的可用属性的未确定列表。所以不是写一些类似巨大的switch语句来评估XML文件是否具有该特定属性的值,而是试图根据XML文件中可用的内容动态地分配属性。

如果我想要做什么是可能的,那么最好的方法是什么?

回答

2

随着propObj定义为你做,你可以这样做:

var propObj:Object = {prop:"x", x:50}; 
var sp:Sprite = new Sprite(); 
sp[propObj.prop] = propObj.x; 

现在,做你正在尝试做的是更宽泛的,或许更为有效的方式:

var props:Object = {x:10,y:50,unexistentProp:300}; 
for (var propName:String in props) { 
    if(sp.hasOwnProperty(propName)) { 
     sp[propName] = props[propName]; 
    } 
} 

上面的代码忽略了未为目标对象定义的属性。这对于非动态类如Sprite是必需的。否则,你的代码会抛出一个错误。如果你想对无效的财产名称做任何事情,这取决于你;如果是这样,你可以在其他地方添加必要的代码。你也可以使用try/catch检测错误,但一定要只捕获这个特定的期望 - ReferenceError - ,否则这可能会掩盖其他错误,如空引用等。其他选项将不检查错误或尝试/捕获并让代码向调用堆栈中抛出一个Error。不过,这对我来说似乎是一个糟糕的主意。尽可能快地处理错误(并尽可能地关闭它发生的地方)更好。

+0

令人惊叹。 hadOwnProperty就像隧道尽头的灯光!为什么我以前没有读过它?!它会让生活变得更容易。太感谢了! – TheDarkIn1978 2010-06-26 03:28:29