如何使用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
相关产品推荐
相关产品推荐

