JavaScript中如何通过字符串名称调用类的私有方法?
问题分析与解决方案
你代码的问题在于:JavaScript的私有方法(以#开头的)是语法层面的私有标识符,不是普通的字符串键名。this["#"+methodName]这种写法是在尝试访问一个名为"#a"或"#b"的公共属性,而不是你定义的私有方法#a/#b,所以自然无法调用成功。
下面给你两种可行的实现方式:
方式一:条件判断(适合方法数量少的场景)
直接通过if/else判断方法名,调用对应的私有方法:
class test1 { message(methodName) { if (methodName === 'a') { this.#a(); } else if (methodName === 'b') { this.#b(); } else { console.log(`不存在名为${methodName}的私有方法`); } } #a() { console.log('调用了私有方法#a'); } #b() { console.log('调用了私有方法#b'); } }
方式二:私有方法映射表(适合方法数量多的场景)
在类内部维护一个私有映射对象,关联方法名和对应私有方法,通过映射表调用:
class test1 { #methodMap = { a: () => this.#a(), b: () => this.#b() }; message(methodName) { const method = this.#methodMap[methodName]; method ? method() : console.log(`不存在名为${methodName}的私有方法`); } #a() { console.log('调用了私有方法#a'); } #b() { console.log('调用了私有方法#b'); } }
这里用箭头函数绑定了this,确保私有方法执行时的上下文正确。
另外提一句,不建议用eval实现(比如eval(this.#${methodName}())),这种写法存在安全风险,若传入恶意构造的methodName会执行危险代码。
内容的提问来源于stack exchange,提问作者Ankit Chanda
相关产品推荐
相关产品推荐

