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

如何修改JS自定义Actors类使其实例可作为函数调用输出预期结果

问题解决方案:修改Actors类支持实例直接调用

核心修改思路

  • 让Actors类的实例具备可调用能力(JS默认普通类实例不支持直接用()调用)
  • 修复原有字符串模板语法错误,调整输出格式匹配预期

修改后完整的Actors.js代码

class Actors {
    constructor(obj) {
        this.name = obj.name;
        this.age = obj.age;
        this.alias = obj.alias;
        this.gender = obj.gender;
        this.powers = obj.powers;

        // 创建可调用的函数对象,调用时执行预期逻辑
        const callableInstance = () => {
            // 别名转大写,能力列表用换行拼接
            return `${this.alias.toUpperCase()}\n${this.powers.join('\n')}`;
        };

        // 绑定原型和实例属性,保证toString等原有方法正常使用
        Object.setPrototypeOf(callableInstance, Actors.prototype);
        Object.assign(callableInstance, this);

        return callableInstance;
    }

    toString() {
        return `name:${this.name} \ngender:${this.gender}\nage:${this.age}`;
    }

    avenger() {
        let str = '';
        this.powers.forEach(element => {
            str += `${element} \n`;
        });
        return `${this.alias}` + str;
    }
}
module.exports.Actors = Actors;

修改点说明

  1. 实现实例可调用:JS中只有带有[[Call]]内部槽的对象才能被直接调用,因此我们在构造函数中创建了箭头函数作为可调用载体,通过Object.setPrototypeOf绑定类原型保证toString等原有方法正常工作,Object.assign同步所有实例属性,最后返回这个函数作为new操作的结果。
  2. 修正语法错误:原有avenger方法中字符串模板$element缺少花括号,修改为${element},调用逻辑中直接使用数组join方法简化拼接,性能和可读性更好。
  3. 适配输出要求:调用时将alias属性转为全大写,能力列表逐行输出,完全匹配预期结果。

可选注意项:原index.js中使用的动态import语法返回Promise,如果你用的是CommonJS模块化规范,建议将导入语句修改为const {Actors} = require("./Actors"); 可直接同步导入使用。

内容的提问来源于stack exchange,提问作者Вадим Иващенко

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 12:09:02