有很多方法可以在javascript中声明一个函数。 其中一种方法是声明一个类和一个静态函数,如下所示。
class className {
static fucntionName() {
}
}
另一种宣告方式是通过传统的javascript风格,如下所示。
export function functionName() {
}
我想知道使用其中任何一种情况的优点/缺点。 是否有静态方法的特定用例,为什么声明一个类(我们知道在javascript中没有必要实例化该类以访问静态函数)。 为什么不在所有/任何用例中使用函数声明的传统方式(上例中的第二种情况)?
我想了解这是详细的。
答案 0 :(得分:1)
苹果和橘子。不必导出类,模块也不必是类。它们不是一回事,虽然导出的模块可以是一个类。我想知道使用其中任何一种情况的优点/缺点。
静态方法是否有任何特定用例
当你想要一个类提供一些功能时,但是这不是什么?特定于该类的单个实例的东西。像var c = Point.interpolate(a, b, .5);
一样
静态interpolate
函数不属于它正在操作的任何点。在提供此功能的类(插值点)上定义此函数静态更合适。
我们知道在javascript中没有必要实例化该类以访问静态函数
这是静态函数的定义,您不必实例化该类来调用它。这不是JS特有的。
为什么不在所有/任何用例中使用函数声明的传统方式(上例中的第二种情况)
因为在我开始时,课程和模块必然是相同的。编写
更好/更清晰class Foo{
...
static fn(){...}
}
大于
class Foo {
...
}
Foo.fn = function(){...};
虽然最后两者都只是
function Foo(){...}
Foo.fn = function(){};
// + Foo.prototype stuff
但是类语法更清晰。即使您只是扫描这段代码,也可以更容易阅读和理解。
答案 1 :(得分:0)
正如您所知,static
方法可以从类本身调用。
非static
方法可以从类的实例调用,因此您基本上必须先创建一个对象才能访问该方法。
例如,对于addNumbers(var a, var b)
return a+b
,是否真的有必要浪费内存实例化类的对象只是为了添加这两个数字?不,你只需要结果,这就是静态的重点。
使用第一种样式允许您对特定类中的方法进行分组(考虑名称空间等)。也许你可以定义像Math
和String
这样的类,它们都有add
方法,但是以不同的方式实现。单独调用add()
会让人感到困惑,但Math.add()
和String.add()
不是。
另一方面,export
风格完全不同。它允许您使用其他模块中的函数。
想一想:
<强> first_module.js 强>
function cube(var x) {
return x * x * x;
}
<强> second_module.js 强>
import { cube } from 'first_module'; // <-- ERROR
alert( cube(3) ); // <-- Undefined function
但是,如果你以这种方式声明first_module:
export function cube(var x) {
return x * x * x;
}
然后second_module将正常工作。
答案 2 :(得分:0)
什么是静态功能?
在类中声明静态函数会创建一个类级别函数,该函数不能由该函数的实例调用。一个例子是Object.assign
函数。静态函数通常用于构建对定义它的类型的实例进行操作的函数。
答案 3 :(得分:0)
静态方法只能在类中调用,并且对于实用程序函数很有用,例如,按摩正在进入的参数变量,或者设置常量(或者前面提到的Object.assign),必须这样做每次,在传递给类的实例之前,以避免不必要的使用记忆,如前一位评论员指出的那样。
清理完所有内容后,您可以导出函数的其余部分,以便在代码中的其他地方进行实例化,其中参数将被清除/常量设置,每次使用该类时都会反复执行,并且您的实例化可以专注于动态的东西。