如何修改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;
修改点说明
- 实现实例可调用:JS中只有带有
[[Call]]内部槽的对象才能被直接调用,因此我们在构造函数中创建了箭头函数作为可调用载体,通过Object.setPrototypeOf绑定类原型保证toString等原有方法正常工作,Object.assign同步所有实例属性,最后返回这个函数作为new操作的结果。 - 修正语法错误:原有
avenger方法中字符串模板$element缺少花括号,修改为${element},调用逻辑中直接使用数组join方法简化拼接,性能和可读性更好。 - 适配输出要求:调用时将
alias属性转为全大写,能力列表逐行输出,完全匹配预期结果。
可选注意项:原index.js中使用的动态import语法返回Promise,如果你用的是CommonJS模块化规范,建议将导入语句修改为
const {Actors} = require("./Actors");可直接同步导入使用。
内容的提问来源于stack exchange,提问作者Вадим Иващенко
相关产品推荐
相关产品推荐

