ActionScript如何显示对象数组内的信息?游戏Mod开发遇阻
解决ActionScript中对象数组显示[object Object]的问题
核心问题是ActionScript中直接调用对象的toString()或拼接对象时,默认只会返回[object Object],不会自动展开属性。针对你的代码,给出以下修改方案:
问题代码分析
- 按Y键时,
this.m_TheirOffersData[0].toString()调用的是Object类默认的toString方法,只会输出[object Object] - 按U键时,
trace(id + " = " + value)同样触发对象默认toString,而且trace无返回值,不能直接赋值给trProgress;同时用for...in遍历数组可能会拿到非数组元素的属性(比如原型链上的内容)
修改后的代码示例
方案1:已知属性时直接指定输出
如果你明确对象包含id、物品名称这类属性,可以直接拼接属性值:
if(param1.keyCode == 89) { var firstOffer:Object = this.m_TheirOffersData[0]; // 拼接需要展示的属性 var detailText:String = "ID: " + firstOffer.id + " | 物品名称: " + firstOffer.itemName; GlobalFunc.SetText(this.debugMenu, detailText, false); GlobalFunc.PlayMenuSound(GlobalFunc.MENU_SOUND_OK); } if(param1.keyCode == 85) { this.trProgress = ""; // 先清空原有内容 // 用普通for循环遍历数组,避免遍历到非元素属性 for(var i:int = 0; i < this.m_TheirOffersData.length; i++) { var offer:Object = this.m_TheirOffersData[i]; this.trProgress += "索引" + i + ": ID=" + offer.id + " | 物品名称=" + offer.itemName + "\n"; } GlobalFunc.SetText(this.debugMenu, this.trProgress, false); GlobalFunc.PlayMenuSound(GlobalFunc.MENU_SOUND_OK); }
方案2:通用对象转字符串函数(未知属性时用)
如果不确定对象的属性列表,可以写一个通用函数遍历所有可枚举属性:
// 通用函数:将对象转为可读字符串 function objToReadableStr(obj:Object):String { var result:String = "{"; var isFirstProp:Boolean = true; for(var propName:String in obj) { if(!isFirstProp) result += ", "; result += propName + ": " + obj[propName]; isFirstProp = false; } result += "}"; return result; } // 修改按键逻辑 if(param1.keyCode == 89) { var objStr:String = objToReadableStr(this.m_TheirOffersData[0]); GlobalFunc.SetText(this.debugMenu, objStr, false); GlobalFunc.PlayMenuSound(GlobalFunc.MENU_SOUND_OK); } if(param1.keyCode == 85) { this.trProgress = ""; for(var i:int = 0; i < this.m_TheirOffersData.length; i++) { this.trProgress += "[" + i + "] " + objToReadableStr(this.m_TheirOffersData[i]) + "\n"; } GlobalFunc.SetText(this.debugMenu, this.trProgress, false); GlobalFunc.PlayMenuSound(GlobalFunc.MENU_SOUND_OK); }
额外提示
- 遍历数组优先用
for(var i:int = 0; i < array.length; i++),for...in会遍历数组的所有可枚举属性(包括原型链上的内容),容易出现异常结果 - 如果
m_TheirOffersData是强类型数组(比如Array.<Offer>),可以直接声明变量类型(var offer:Offer = ...),代码可读性和安全性会更高
内容的提问来源于stack exchange,提问作者John Rocha YSoButtHurt
相关产品推荐
相关产品推荐

