我们知道在class中定义的static方法,在使用时可以直接调用,不用实例化,我的疑惑是
- 在定义类的方法的时候,什么方法适宜定义成static,什么方法不用?
- 我可不可以把类中的方法都定义为static,这样做有什么弊端没有?
还请各位大神详细介绍下class的适用场景以及static的适用场景,不胜感激!
我们知道在class中定义的static方法,在使用时可以直接调用,不用实例化,我的疑惑是
还请各位大神详细介绍下class的适用场景以及static的适用场景,不胜感激!
泻药,静态方法的食用方式你也知道了,那么问题1也不言而喻,不属于实例的方法都应该是静态的,比如 Array.isArray
, Array.from
,都是跟实例无关的,一般就是一些 helper 方法。至于问题2,这么做是不行的,static 之后实例中就不能调用这些方法了。
8 回答4.7k 阅读✓ 已解决
6 回答3.4k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
在OOP中,带方法的类(即非数据类),一般有两个作用
不管哪个作用,方法通常都是会操作成员变量的,这种情况下,肯定只能写实例方法(因为要操作成员)
除此之外,不需要访问类属性的方法都可以写成静态的,这类方法一般都是 Helper 方法,即对输入进行处理再得到一个输出,与对象的成员无关。这类方法也可以直接写为公共函数(非方法函数)。不过在 C#、Java、TypeScript 等有权限限制的语言中,静态方法可以访问对象的私有成员,比如
Foo
类的Foo.bla(f: Foo)
静态方法内部可以直接访问f.somePrivateMethod()
,当然目前 JavaScript 中不存在这种情况,以后引入私有成员之后会不会存在这种情况也还要观望顺便说一下,多数静态类型语言中成员方法都是可以直接调用同一个类的静态方法的,但 JavaScript 由于实现机制不能,做不到。
回看有惊喜,2020-02-27 更新
JavaScript 的私有字段提议已经到了 stage-3 (实验) 阶段,TypeScript 3.8 和 Chrome 7.4 已经支持私有字段,那么前面提到的疑惑其实是可以实验来验证的
实验环境:
实验代码,TypeScript
结论
static create()
) 中可以访问对象的私有成员 (#name
和#age
)inst.#name = "Hello"
会报错)