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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:25:30