为何Resource是构造函数可正常工作,Building却无法作为构造函数使用?
问题分析:Building构造函数无法正常工作的原因
看你的代码,问题主要出在NewBuilding函数里对Building实例的存储逻辑,以及可能未正确初始化相关变量,具体拆解如下:
1. 错误复用构造函数作为实例存储容器
在NewResource中,你用Res[Resz]存储新的Resource实例——这里的Res应该是你预先定义好的数组(比如let Res = [];),专门用来存放所有资源实例。但到了NewBuilding里,你却写成了Building[Buildz] = new Building(name);,这里的Building是构造函数本身(一个函数对象),而非专门的实例存储容器。
虽然JavaScript允许给函数对象添加属性,但这不是合理的设计;更关键的是,如果Buildz变量没有预先初始化(比如let Buildz = 0;),会直接抛出ReferenceError,连new Building(name)这行实例化代码都无法正常执行。
2. Resource能正常工作的核心原因
Resource可以正常运行,是因为你应该已经正确初始化了Res数组和Resz计数器(比如let Res = []; let Resz = 0;),每次调用NewResource时都是往数组里添加新实例,逻辑完全通顺。
修复方案
给Building实例创建专门的存储数组并初始化计数器,修改NewBuilding函数即可:
// 初始化Building实例的存储数组和计数器(和Resource逻辑对齐) let Buildings = []; let Buildz = 0; function NewBuilding(name) { // 往Buildings数组中添加新实例,而非给构造函数添加属性 Buildings[Buildz] = new Building(name); createBuildingBtn(name); Buildz++; }
小建议:变量名尽量语义化一点,比如把Res改成resources,Resz改成resourceIndex,Buildz改成buildingIndex,能大幅提升代码可读性~
内容的提问来源于stack exchange,提问作者Schlauewurst
相关产品推荐
相关产品推荐

