将方法作为静态有什么好处吗?

Avr*_*dis 7 javascript ecmascript-6

我正在使用Webstorm,我写了一个React组件,我的代码如下:

async onDrop( banner, e ) {
    banner.classList.remove( 'dragover' );
    e.preventDefault();

    const file = e.dataTransfer.files[ 0 ], reader = new FileReader();
    const { dispatch } = this.props;

    const result = await this.readFile( file, reader );

    banner.style.background = `url( ${ result } ) no-repeat center`;
    dispatch( addLayer( file ) );

    return false;
}


@isImage( 0 )
readFile( file, reader ) {
    reader.readAsDataURL( file );

    return new Promise( function ( resolve, reject ) {
        reader.onload = ( event ) => resolve( event.target.result );
        reader.onerror = reject;
    } );
}


onDragOver( banner ) {
    banner.classList.add( 'dragover' );
    return false;
}
Run Code Online (Sandbox Code Playgroud)

Webstorm的代码检查建议我Method can be static使用该onDragOver方法.我的问题是:

将该方法作为静态或这个建议在某种程度上无用是否有任何实际好处?

Mad*_*iha 11

是的,在调用静态函数时,您不需要该对象的实例.您只需要对构造函数的引用:

class Foo {
  static bar() { console.log("foo"); }
}

Foo.bar(); // outputs "foo" to console
Run Code Online (Sandbox Code Playgroud)

无需new Foo()任何地方.

按照惯例,当您实际需要来自实例的状态(读取状态或写入状态)时,应该使用实例方法.

检查会告诉你,当你有没有原型/类方法this中它(并因此并不需要一个实例).

  • 不,这是一个有意义的问题.我没有意义为`Math.random()`创建一个`new Math()`,没有什么需要对象的状态. (5认同)
  • 如果我从Math类中调用Math.random()怎么办?从Math中的另一个方法调用Math.random()而不是this.random()是不是很奇怪? (5认同)
  • 使用ClassName.method()调用静态方法确实不是很奇怪,即使从类内部也是如此。实际上,这就是几乎所有编程语言都具有用于类的静态方法的方式。您应该将所有不使用状态的方法转变为静态方法,而不是出于技术方面的考虑,而是为了更好地传达所述方法/功能的意图和可能的副作用。 (2认同)