JavaScript如何通过构造函数正确为对象添加自定义方法
问题解答
你的需求完全可以实现,现有代码存在以下问题:
- 构造函数未定义形参,调用
new pol传入的7个参数没有接收入口,导致内部赋值的name/moc等变量全部为未定义状态 - 构造函数中
price错误使用立即执行函数,导致price属性是函数执行后的返回值而非可调用方法,后续调用.price()会直接抛出类型错误;同时函数内部引用的wynik1未定义,A/B/C/D也没有绑定到当前实例,执行时会报错 - 存在多处语法错误:
price的立即执行函数多写了一个右括号,后续moc函数里return后多了冒号,三个判断条件全部写为k=="A",逻辑完全重复 - 实例访问方式错误:
Ringo/Bingo/Zingo都是独立声明的全局变量,不是构造函数pol的静态属性,用pol.Ringo访问无法拿到对应实例 - 后续逻辑中
k变量未定义就直接在立即执行函数里调用,执行时会报错
修正后的完整代码
构造函数与实例化部分
// 构造函数定义形参接收传入值 function pol (name, moc, square, A, B, C, D) { this.name = name; this.moc = moc; this.square = square; this.A = A; this.B = B; this.C = C; this.D = D; // price改为普通方法,接收wynik1作为入参,通过this绑定当前实例的ABCD值 this.price = function(wynik1){ if(wynik1 > 18000){ return this.A;} if(wynik1 > 10000){ return this.B;} if(wynik1 > 5000){ return this.C;} if(wynik1 > 3000){ return this.D;} // 补充默认返回避免无匹配时返回undefined return 0; } } // 实例化逻辑不变 var Bingo = new pol ("Psyche", 370, 1.7, 4000, 4200, 4600, 5000); var Ringo = new pol("Psyche Myche", 370, 1.7, 4000, 4200, 4600, 5000); var Zingo = new pol("Psyche Ryche", 370, 1.7, 4000, 4200, 4600, 5000); // 正确访问实例属性和方法 var moc = Ringo.moc var pow = Ringo.square // 调用price方法需要传入wynik1的具体值,示例传入6000 var prices = Ringo.price(6000);
后续匹配逻辑修正
// 先定义k的取值,再按需求匹配对应实例 var k = "B"; var getMoc = function (){ if(k =="A"){return Ringo.moc} if(k =="B"){return Bingo.moc} if(k =="C"){return Zingo.moc} return 0; }();
如果需要更简洁的匹配逻辑,可以把实例统一存入映射对象:
var instanceMap = { A: Ringo, B: Bingo, C: Zingo } // 一行即可完成取值,自带兜底默认值 var moc = instanceMap[k]?.moc || 0;
内容的提问来源于stack exchange,提问作者user17527590
相关产品推荐
相关产品推荐

