static与new.target关键字

static

static 在类中定义静态方法。

什么时候能用

看方法里,有没用到this,没用到就可以考虑用静态方法。静态方法通常用于创建实用程序函数,例如,创建或克隆对象。

什么时候不能用

不能在类的实例上调用。

怎么调用

以下几种情况都可调用:

  1. 静态方法调用直接在类上进行。

  2. 静态方法调用同一个类中的其他静态方法,可使用 this 关键字

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class StaticMethodCall {
    static staticMethod() {
    return 'Static method has been called';
    }
    static anotherStaticMethod() {
    return this.staticMethod() + ' from another static method';
    }
    }
    StaticMethodCall.staticMethod();
    // 'Static method has been called'

    StaticMethodCall.anotherStaticMethod();
    // 'Static method has been called from another static method'
  3. 非静态方法中,不能直接使用 this 关键字来访问静态方法。而是要用类名来调用:CLASSNAME.STATIC_METHOD_NAME() ,或者用构造函数的属性来调用该方法: this.constructor.STATIC_METHOD_NAME().

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class StaticMethodCall {
    constructor() {
    console.log(StaticMethodCall.staticMethod());
    // 'static method has been called.'
    console.log(this.constructor.staticMethod());
    // 'static method has been called.'
    }
    static staticMethod() {
    return 'static method has been called.';
    }
    }

new.target

**new.target**属性允许检测函数或构造方法是否是通过new运算符被调用的。在普通函数(没有被 new 的函数)调用中,new.target 的值是undefined

注意,在类的构造方法中,new.target指向直接被new执行的构造函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class A {
constructor() {
console.log(new.target.name);
}
}

class B extends A {
constructor() {
super();
}
}

var a = new A(); // logs "A"
var b = new B(); // logs "B"

class C {
constructor() {
console.log(new.target);
}
}
class D extends C {
constructor() {
super();
}
}

var c = new C(); // logs class C{constructor(){console.log(new.target);}}
var d = new D(); // logs class D extends C{constructor(){super();}}

相关链接

[1] mdn web docs - static

[2] mdn web docs - new.target