JavaScript跨对象访问报错:Cannot access 'rookie' before initialization求解
问题解答:数码宝贝进化链对象的初始化顺序错误
调用方式是否正确?
这种直接在inTraining对象定义中引用rookie.agumon的方式完全不正确。原因是JavaScript遵循从上到下的变量初始化顺序,当你定义inTraining时,rookie对象还未创建,此时访问rookie.agumon会触发"Cannot access 'rookie' before initialization"的引用错误。
解决方案
以下是三种可行的解决方法,可根据场景选择:
1. 先定义所有对象,再补充关联属性
先创建所有数码宝贝对象的基础结构,等所有对象初始化完成后,再设置进化关联:
// 先定义基础结构 const inTraining = { koromon: { name: "滚球兽", level: "幼年期II" } }; const rookie = { agumon: { name: "亚古兽", level: "成长期" } }; // 最后补充进化关联 inTraining.koromon.line = rookie.agumon;
2. 使用函数延迟求值
将line设置为函数,需要访问进化目标时再调用函数,避开初始化顺序限制:
const inTraining = { koromon: { name: "滚球兽", level: "幼年期II", // 用函数延迟获取rookie.agumon line: () => rookie.agumon } }; const rookie = { agumon: { name: "亚古兽", level: "成长期" } }; // 访问进化目标时调用函数 console.log(inTraining.koromon.line().name); // 输出"亚古兽"
3. 使用Getter属性延迟获取
通过Object.defineProperty给koromon添加getter属性,第一次访问line时才读取已初始化的rookie对象:
const inTraining = { koromon: { name: "滚球兽", level: "幼年期II" } }; const rookie = { agumon: { name: "亚古兽", level: "成长期" } }; // 定义getter属性,访问时自动返回rookie.agumon Object.defineProperty(inTraining.koromon, 'line', { get: () => rookie.agumon, enumerable: true // 让属性可被遍历(可选) }); // 直接访问line即可,和普通属性用法一致 console.log(inTraining.koromon.line.name); // 输出"亚古兽"
内容的提问来源于stack exchange,提问作者FrontDevUp
相关产品推荐
相关产品推荐

