AS3使用[]运算符访问SharedObject嵌套属性失效问题
核心原因
方括号运算符仅支持识别单层级属性名,不会自动解析字符串中的点号做多级属性跳转。当你传入"userData.data.Game1Score"这类带点的完整路径字符串时,运行时会直接查找当前对象下名称完全等于这整串字符的属性,自然无法匹配到你要的多级嵌套属性。
顺带提一句,你初始的变量定义代码里有笔误,给data2赋值时错误指向了Game1Score,实际开发时注意对应关卡编号,避免分数串档。
实现方案
你现在的中转变量+重复赋值的写法扩展性太差,关卡越多冗余代码越多,可以根据需求选下面两种写法:
方案1:通用多级路径存取方法
如果后续还会有多层嵌套的属性需要动态访问,可以写两个通用方法,自动拆分点分隔的路径逐层寻址:
// 按路径给嵌套属性赋值 function setPropByPath(root:Object, path:String, val:*):void { const segments:Array = path.split("."); let cursor:Object = root; // 先遍历到目标属性的父级节点 for (let i:int = 0; i < segments.length - 1; i++) { cursor = cursor[segments[i]]; if (cursor == null) return; // 中间节点不存在直接终止,避免抛错 } // 给最终节点赋值 cursor[segments[segments.length - 1]] = val; } // 按路径读取嵌套属性值 function getPropByPath(root:Object, path:String):* { const segments:Array = path.split("."); let cursor:Object = root; for (let i:int = 0; i < segments.length; i++) { cursor = cursor[segments[i]]; if (cursor == null) return undefined; } return cursor; }
使用时不需要再定义data1、data2这类全局中转变量,也不需要在更新函数里挨个给GameXScore赋值:
var currentScorePath:String; // 游戏入口按钮直接绑定对应分数的存储路径 function BtnGame1(event:MouseEvent):void { currentScorePath = "Game1Score"; } function BtnGame2(event:MouseEvent):void { currentScorePath = "Game2Score"; } // 结算页存分逻辑 function NextoPageLevel(event:MouseEvent):void { setPropByPath(userData.data, currentScorePath, 3); // 示例分数3 userData.flush(); }
注意:SharedObject修改属性后必须调用flush()方法才会把数据持久化到本地,否则可能在游戏意外退出时丢失分数数据。
方案2:计分场景极简写法
如果所有关卡分数都直接存在userData.data下,没有多层嵌套,连路径解析方法都不需要写,直接用关卡标识作为属性名动态访问即可:
var currentGameKey:String; function BtnGame1(event:MouseEvent):void { currentGameKey = "Game1Score"; } function BtnGame2(event:MouseEvent):void { currentGameKey = "Game2Score"; } function NextoPageLevel(event:MouseEvent):void { userData.data[currentGameKey] = 3; userData.flush(); }
后续加新关卡只需要加对应的按钮绑定新的GameXScore字符串就行,完全不用改存分、更新存档的公共逻辑,没有冗余代码。
内容的提问来源于stack exchange,提问作者Ahlan
相关产品推荐
相关产品推荐

