JavaScript遍历自定义类对象数组时调用成员函数报错求助
问题解决方法
1. 修正DataSet类的属性初始化错误
你当前类中属性的写法title = String是把title赋值为String构造函数本身,而非字符串类型的初始值,这会导致属性类型异常。正确的初始化应该给属性设置对应类型的默认值:
class DataSet{ title = '' // 空字符串默认值 description = '' attributes = [] constructor(title, description) { this.title = title this.description = description } setAttribute(a){this.attributes.push(a)} }
2. 确保数组元素是DataSet实例
如果dataSets数组中的元素不是通过new DataSet(...)创建的实例,而是普通对象,那么自然没有setAttribute方法。创建实例时必须使用构造函数:
// 正确创建实例的方式 const dataSets = [ new DataSet('标题1', '描述1'), new DataSet('标题2', '描述2') ];
3. 使用正确的数组遍历方式
for...in循环遍历的是数组的索引(字符串类型),而非数组元素本身,所以你之前的代码中data是索引字符串,调用data.setAttribute必然报错。推荐以下几种遍历方式:
方式一:for...of循环(直接遍历元素)
for (const data of dataSets) { data.setAttribute('attribute'); }
方式二:普通for循环(通过索引取元素)
for (let i = 0; i < dataSets.length; i++) { dataSets[i].setAttribute('attribute'); }
方式三:forEach方法
dataSets.forEach(data => { data.setAttribute('attribute'); });
验证实例类型
如果还是报错,可以先验证数组元素是否为DataSet实例:
console.log(dataSets[0] instanceof DataSet); // 应为true
如果返回false,说明该元素不是DataSet实例,需要检查创建元素的代码逻辑。
内容的提问来源于stack exchange,提问作者Thomas Mildner
相关产品推荐
相关产品推荐

