类内的静态方法和类外的函数有什么区别 (JavaScript)

What's the difference between static method inside a class and a function outside of it (JavaScript)

提问人:stepaks675 提问时间:7/1/2023 最后编辑:Bergistepaks675 更新时间:7/2/2023 访问量:67

问:

我真的不明白将静态方法放入类中然后使用此类调用它而不是仅使用相同代码创建函数的目的是什么。

class test {
    static sum(a,b){
        return (a+b)
    }
}
sum = (a,b) => a+b
console.log(sum(10,5)) //15
console.log(test.sum(10,5)) //15

有何不同?为什么人们使用静态类?

JavaScript 函数 方法 static-methods

评论

0赞 Roko C. Buljan 7/1/2023
如果不是太压倒性,请始终考虑事先查看一些文档 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/......
0赞 Yousaf 7/1/2023
您了解为什么需要或使用类吗?如果没有,那么在考虑静态方法之前,您应该先了解类。
1赞 trincot 7/1/2023
这是一个将属于一起的事物组合在一起的问题。静态方法将提供与该类相关的功能。
1赞 Bergi 7/2/2023
真的没有区别。只有当你已经有一个用于其他目的的类,并且该函数以某种方式属于它时,将静态的东西放在类上才有意义。一旦你导入了类,你就会得到它的函数(而不必单独导入它),纯粹是为了方便起见。(此外,在某些类继承模式中,重写静态方法可能很有用,但这种情况很少见)。

答:

2赞 deceze 7/2/2023 #1

独立函数和类上的静态方法之间确实没有真正的技术区别。如果没有差异,则不应不必要地将函数包装在类中。

但是,它可能有利于可理解性。例如,builtin 类有一些静态方法,如 Date.now。这显然是有意义的,因为它非常相关。如果它不是 上的静态方法,它将是一个全局函数,它需要被命名为有用的东西,并且不应该与其他全局名称冲突。仅仅命名它可能会占用一个有价值的全球名称,并导致混乱或冲突。比较:DateDateDateDatenow

let foo = now();
let bar = Date.now();

Date.now这里更清楚,也没有占用另一个全球名称。


现在(双关语),ES6 模块在某种程度上解决了这个问题,因为它为您提供了另一个对相关功能进行分组的工具:模块。使用模块,您可以简单地从模块中导出一个独立的函数和一个单独的类,调用者可以随心所欲地使用它:

import { now, Date } from 'hypothetical-date';

let foo = now();
let bar = new Date;

// or

import hdate from 'hypothetical-date';

let foo = hdate.now();
let bar = new hdate.Date;