V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
humbass
V2EX  ›  Node.js

如何获得 class 内部的方法?

  •  
  •   humbass · 2023-08-01 21:10:48 +08:00 · 1852 次点击
    这是一个创建于 477 天前的主题,其中的信息可能已经有所发展或是发生改变。

    求教:如下类运行的时候,如何在 constructor 中获得 App 所定义的方法名称

    class App {
      constructor() {
        // 如何在这里获得 App 下面的所有方法?
      }
      play() {}
      unplay() {}
      pause() {}
      dosome() {}
      dosome2() {}
    }
    new App()
    
    第 1 条附言  ·  2023-08-01 23:52:46 +08:00
    感谢 @USDT ( 4 楼) @airyland ( 6 楼),两种方法都可以获得方法名;

    上周我自己实现的方式比较诡异,我在需要暴露的方法前面加了一个下划线,然后

    const methods = this.constructor.toString()
    .match(/_([a-zA-Z]+)(\s*\(\))/g)
    .map(item => item.match(/([a-zA-Z]+)/)[0])

    感觉是歪门邪道,哈哈哈

    已经给 4 楼、6 楼点赞,并且点赞还必须是第三方手机端才有,web 版本找不到哪里可以点赞!
    10 条回复    2023-08-02 11:15:11 +08:00
    LawlietZ
        1
    LawlietZ  
       2023-08-01 21:18:58 +08:00
    this 里面
    nkidgm
        2
    nkidgm  
       2023-08-01 21:20:52 +08:00
    不是有反射的 API 吗?

    Class 所有信息都可以拿到。
    logAn7
        3
    logAn7  
       2023-08-01 21:24:39 +08:00
    Class<App> appClass = App.class;
    Method[] methods = appClass.getDeclaredMethods();
    USDT
        4
    USDT  
       2023-08-01 21:25:44 +08:00   ❤️ 1
    用 Reflect

    class App {
    constructor() {
    // 如何在这里获得 App 下面的所有方法?
    const {ownKeys, getPrototypeOf} = Reflect;
    console.log('methods:', ownKeys(getPrototypeOf(this)));
    // 多了一个 constructor ,自行 filter 下
    }
    play() {}
    unplay() {}
    pause() {}
    dosome() {}
    dosome2() {}
    }
    new App() // output: [ 'constructor', 'play', 'unplay', 'pause', 'dosome', 'dosome2' ]
    logAn7
        5
    logAn7  
       2023-08-01 21:26:31 +08:00   ❤️ 1
    @logAn7 呃呃我审题不认真了😫
    airyland
        6
    airyland  
       2023-08-01 22:00:29 +08:00   ❤️ 1
    constructor() {
    this.proto = Object.getPrototypeOf(this);

    const methods = Object.getOwnPropertyNames(this.proto).filter(item => typeof this.proto[item] === 'function')

    console.log(methods)
    }
    jaylee4869
        7
    jaylee4869  
       2023-08-01 22:06:12 +08:00
    通过 Object.getOwnPropertyNames(App.prototype) 获取 App 类原型上的所有属性名称(包括方法名)。然后用 filter 筛选出类型为函数(方法)且不是 constructor 的属性
    xiangyuecn
        8
    xiangyuecn  
       2023-08-01 23:54:04 +08:00
    这题我不会,所以,直接丢王炸:

    constructor() {
    var code=App+"";
    //从源码文本 code 中提取函数名字😂
    }
    jifengg
        9
    jifengg  
       2023-08-02 08:57:47 +08:00
    针对附言的回复:web 的“感谢”,是需要鼠标悬停才会显示的,悬停位置在楼号左边的回复按钮的左边
    Belmode
        10
    Belmode  
       2023-08-02 11:15:11 +08:00
    class App {
    constructor() {
    const funcs = Object.getOwnPropertyNames(Reflect.getPrototypeOf(this)).filter(it => it != 'constructor')
    console.log(funcs)
    }
    play() {}
    unplay() {}
    pause() {}
    dosome() {}
    dosome2() {}
    }

    new App()
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3401 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 11:35 · PVG 19:35 · LAX 03:35 · JFK 06:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.