初始化对象时访问内部索引触发Uncaught TypeError如何解决?
问题分析与解决方案
报错原因
你在定义state[id]对象的过程中,state[id]还未完成赋值(此时state[id]是undefined),就尝试通过state[id].house访问内部属性,自然会抛出"Cannot read properties of undefined"的错误。
可行解决方案
方案1:先将house存为变量,再构建对象
先把house对象单独定义为变量,这样在创建car时可以直接引用这个变量,避免依赖未初始化的state[id]:
var state = {} function init(id) { const house = { 'test': ['hi', 'hey'] }; state[id] = { house, car: { output: house['test'][0] } } } init(1);
方案2:使用getter延迟属性计算
通过get关键字定义car,这样只有当你访问car属性时,才会执行内部逻辑,此时state[id].house已经存在:
var state = {} function init(id) { state[id] = { house: { 'test': ['hi', 'hey'] }, get car() { return { output: this.house['test'][0] } } } } init(1); // 访问方式:state[1].car.output
方案3:分步初始化对象
先创建包含house的基础对象,再补充car属性,此时state[id]已经存在,可以正常访问house:
var state = {} function init(id) { state[id] = { house: { 'test': ['hi', 'hey'] } }; state[id].car = { output: state[id].house['test'][0] }; } init(1);
为什么之前的尝试无效
this.state[id].house:函数内的this指向全局对象,虽然能拿到state,但state[id]仍未初始化,问题本质没变。this.house/house:对象字面量中,this不指向正在创建的对象;直接写house会被当作独立变量,而非对象属性,所以无法访问到目标值。
内容的提问来源于stack exchange,提问作者zhin dins
相关产品推荐
相关产品推荐

