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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:45:10