V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
checgg
V2EX  ›  问与答

为什么 ES6 的实例类不能调用静态方法?

  •  
  •   checgg · 2018-06-20 21:37:06 +08:00 · 2351 次点击
    这是一个创建于 2373 天前的主题,其中的信息可能已经有所发展或是发生改变。
    class Test {
    	static hehe() {
        }
    }
    
    Test.hehe()
    //(new Test()).hehe()
    

    想问一下这是为什么要这样设计?

    11 条回复    2018-06-21 09:40:39 +08:00
    flowfire
        1
    flowfire  
       2018-06-20 21:53:32 +08:00 via iPhone
    难道不是所有语言都这样么,一脸懵逼
    murmur
        2
    murmur  
       2018-06-20 21:58:51 +08:00
    @flowfire 不太确定 java 可以不?》
    azh7138m
        3
    azh7138m  
       2018-06-20 22:30:10 +08:00
    如果我们只说如何调用的话
    const test = new Test();
    test.constructor.hehe();
    就可以了,
    如果你要问为什么是这样处理的话,我还没找到合理的解释
    nealv2ex
        4
    nealv2ex  
       2018-06-20 22:34:28 +08:00
    实例方法和静态方法,楼主搞清楚这 2 个东西的概念和区别应该就没有这个问题了
    zsdroid
        5
    zsdroid  
       2018-06-20 22:43:48 +08:00
    不忍直视
    kimown
        6
    kimown  
       2018-06-20 23:13:18 +08:00 via Android
    你可以看下 babel transform 后的代码,class Test 其实是语法糖,最终是由 function Test 实现的,static 只把 hehe 作为一个属性添加到 function Test 上,并没有把 hehe 绑定在 function Test 里面作为 this.hehe
    loy6491
        7
    loy6491  
       2018-06-20 23:57:24 +08:00
    ES 几都一样

    function Test () {}
    Test.hehe = function () {}
    Test.prototype.xixi = function () {}

    ✔️ Test.hehe();
    ✔️ (new Test()).xixi()
    lancelock
        8
    lancelock  
       2018-06-21 06:51:42 +08:00
    不这样要 static 干嘛?
    yamedie
        9
    yamedie  
       2018-06-21 07:59:41 +08:00 via Android
    static 是供 class 中其他暴露在外的方法调用的,是内部方法,本身不对外暴露,就是这样设计的吧
    SilentDepth
        10
    SilentDepth  
       2018-06-21 09:18:50 +08:00
    楼上几位大概没理解楼主的问题。楼主问的是:静态方法被设计为不能被实例直接调用,这个设计的动机是什么?

    class A {static test() {console.log(1)}}
    (new A()).test()

    如上述代码,为什么 A 的实例在内部未定义 test 方法时不能自动调用类甚至父类的静态方法?
    AlloVince
        11
    AlloVince  
       2018-06-21 09:40:39 +08:00
    ```
    class A {static test() {console.log(1)}}

    class B extends A {static test() {console.log(1)}}

    let ins = new B();
    ins.test(); //class A or class B
    ```

    js 没有 java 的强制类型转换,那么如果父类和子类同时定义同名静态方法,实例调用的时候无法区分到底是调用父类还是子类的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1003 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:12 · PVG 05:12 · LAX 13:12 · JFK 16:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.