class Test {
static hehe() {
}
}
Test.hehe()
//(new Test()).hehe()
想问一下这是为什么要这样设计?
1
flowfire 2018-06-20 21:53:32 +08:00 via iPhone
难道不是所有语言都这样么,一脸懵逼
|
3
azh7138m 2018-06-20 22:30:10 +08:00
如果我们只说如何调用的话
const test = new Test(); test.constructor.hehe(); 就可以了, 如果你要问为什么是这样处理的话,我还没找到合理的解释 |
4
nealv2ex 2018-06-20 22:34:28 +08:00
实例方法和静态方法,楼主搞清楚这 2 个东西的概念和区别应该就没有这个问题了
|
5
zsdroid 2018-06-20 22:43:48 +08:00
不忍直视
|
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
|
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() |
8
lancelock 2018-06-21 06:51:42 +08:00
不这样要 static 干嘛?
|
9
yamedie 2018-06-21 07:59:41 +08:00 via Android
static 是供 class 中其他暴露在外的方法调用的,是内部方法,本身不对外暴露,就是这样设计的吧
|
10
SilentDepth 2018-06-21 09:18:50 +08:00
楼上几位大概没理解楼主的问题。楼主问的是:静态方法被设计为不能被实例直接调用,这个设计的动机是什么?
class A {static test() {console.log(1)}} (new A()).test() 如上述代码,为什么 A 的实例在内部未定义 test 方法时不能自动调用类甚至父类的静态方法? |
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 的强制类型转换,那么如果父类和子类同时定义同名静态方法,实例调用的时候无法区分到底是调用父类还是子类的 |