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

2018-06-20 21:37:06 +08:00
 checgg
class Test {
	static hehe() {
    }
}

Test.hehe()
//(new Test()).hehe()

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

2195 次点击
所在节点    问与答
11 条回复
flowfire
2018-06-20 21:53:32 +08:00
难道不是所有语言都这样么,一脸懵逼
murmur
2018-06-20 21:58:51 +08:00
@flowfire 不太确定 java 可以不?》
azh7138m
2018-06-20 22:30:10 +08:00
如果我们只说如何调用的话
const test = new Test();
test.constructor.hehe();
就可以了,
如果你要问为什么是这样处理的话,我还没找到合理的解释
nealv2ex
2018-06-20 22:34:28 +08:00
实例方法和静态方法,楼主搞清楚这 2 个东西的概念和区别应该就没有这个问题了
zsdroid
2018-06-20 22:43:48 +08:00
不忍直视
kimown
2018-06-20 23:13:18 +08:00
你可以看下 babel transform 后的代码,class Test 其实是语法糖,最终是由 function Test 实现的,static 只把 hehe 作为一个属性添加到 function Test 上,并没有把 hehe 绑定在 function Test 里面作为 this.hehe
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
2018-06-21 06:51:42 +08:00
不这样要 static 干嘛?
yamedie
2018-06-21 07:59:41 +08:00
static 是供 class 中其他暴露在外的方法调用的,是内部方法,本身不对外暴露,就是这样设计的吧
SilentDepth
2018-06-21 09:18:50 +08:00
楼上几位大概没理解楼主的问题。楼主问的是:静态方法被设计为不能被实例直接调用,这个设计的动机是什么?

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

如上述代码,为什么 A 的实例在内部未定义 test 方法时不能自动调用类甚至父类的静态方法?
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 的强制类型转换,那么如果父类和子类同时定义同名静态方法,实例调用的时候无法区分到底是调用父类还是子类的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/464526

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX