对象字面量中的自引用问题:如何计算每周两场比赛的平均得分
解决方案
对象字面量初始化阶段无法直接自引用属性,因为此时对象实例还未完全创建,this指向的是外层作用域而非当前对象,你可以通过以下三种方式实现需求:
方法1:使用 getter 实现动态计算(最推荐)
通过 getter 定义average属性,访问属性时自动触发计算,此时this会指向当前周的对象实例,可以直接读取同对象下的其他属性:
var scores = { week1: { game1: 55, game2: 62, get average() { return (this.game1 + this.game2) / 2 } }, week2: { game1: 71, game2: 67, get average() { return (this.game1 + this.game2) / 2 } } }; // 调用方式和普通属性完全一致,scores.week1.average 直接返回 58.5
- 优势:后续修改
game1/game2的数值时,average会自动更新,不需要手动重新计算
方法2:分步骤初始化生成静态属性
如果你需要average是固定的静态数值而非动态计算属性,可以拆分对象初始化步骤:
// 第一步先定义每周比赛得分 var scores = { week1: { game1: 55, game2: 62 }, week2: { game1: 71, game2: 67 } }; // 第二步遍历计算每个周的平均得分 for (const week in scores) { scores[week].average = (scores[week].game1 + scores[week].game2) / 2; }
- 优势:
average是普通数值属性,JSON序列化时会正常包含在内(getter默认不会被序列化输出)
方法3:工厂函数批量生成周对象
如果周数较多,可以通过工厂函数减少重复代码:
function createWeekScores(game1, game2) { return { game1, game2, average: (game1 + game2) / 2 } } var scores = { week1: createWeekScores(55, 62), week2: createWeekScores(71, 67) };
内容的提问来源于stack exchange,提问作者illy
相关产品推荐
相关产品推荐

