You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用prototype映射对象内的数组对象?遇x()不是函数报错

解决你的map() is not a function报错问题

我看到你在自定义Mapping类的原型方法里碰到了这个报错,核心问题是混淆了实例对象和数组属性的调用关系,咱们一步步拆解清楚:

错误原因分析

在你的protoMap方法里,你写了let protoMap = map.map(function(map){...}):

  • 这里的第一个map是你创建的Mapping实例(let map = new Mapping(mapped);),它是一个自定义对象,不是数组,自然没有map方法,这就是报错的根源
  • 你真正要处理的是实例上的mappedData属性——也就是你传入的那个数组mapped

另外还有个小坑:回调函数的参数名用了map,和外部的实例变量重名了,很容易搞混,建议改成更清晰的名字比如item。

修正后的完整代码

let data = [ {'a':1, 'b':2, 'c':3}, {'a':4, 'b':5, 'c':6}, {'a':7, 'b':8, 'c':9} ]
let mapped = data.map(function(data){ 
  let newMap = {} 
  newMap['a']=data['a'] 
  newMap['b']=data['b'] 
  return newMap; 
});

function Mapping(data = []){ 
  this.mappedData = data 
};

// 修正原型方法:用this.mappedData访问数组,同时调整参数名避免混淆
Mapping.prototype.protoMap = function(){ 
  let protoMap = this.mappedData.map(function(item){ 
    let protoMap1 = {} 
    protoMap1['a'] = item['a'] 
    return protoMap1; 
  });
  // 记得返回处理后的结果,不然调用这个方法拿不到值
  return protoMap;
};

let map = new Mapping(mapped);
// 现在调用protoMap就能正常工作了
console.log(map.protoMap()); // 输出: [ {a:1}, {a:4}, {a:7} ]

额外优化建议

你可以用箭头函数和对象解构让代码更简洁,减少冗余:

// 简化mapped的生成
let mapped = data.map(({a, b}) => ({a, b}));

// 简化protoMap方法
Mapping.prototype.protoMap = function(){ 
  return this.mappedData.map(({a}) => ({a}));
};

这样代码可读性更高,也不容易出错。

内容的提问来源于stack exchange,提问作者snakeoilforcheap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 09:57:44