静态成员和实例成员有什么区别?

时间:2019-04-03 16:04:49

标签: javascript reactjs ecmascript-6

我想知道这两个函数在javascript这个示例类中有什么区别?

class Sample{
  constructor(){}

  sampleOne(){
    console.log('this is test')
  }
  static sampleTwo(){
    console.log('this is test too')
  }
}

5 个答案:

答案 0 :(得分:2)

第一个是 instance方法。这意味着,您必须创建Sample类的新实例才能调用它:

let instance = new Sample();
instance.sampleOne();

第二个是静态方法,因此您不必具有该类的实例即可调用它:

Sample.sampleTwo();

答案 1 :(得分:2)

JavaScript没有类,因此关于“类”和“实例”的解释不准确。在javascript中,只有对象,它们具有构造函数(函数)和原型(其他对象)。 ES6“类”语法只是一个装饰器,它仅将类Java的类声明转换为原型,即:

  • 类被转换为构造函数(函数):

    class Sample => function Sample()
    
  • 常规方法附加到构造函数的prototype属性,并在以后执行object.[[Prototype]]时复制到new Sample()

    sampleOne  => Sample.prototype.sampleOne
    
  • “静态”方法直接附加到构造函数:

    sampleTwo  => Sample.sampleTwo
    

插图:

enter image description here

答案 2 :(得分:0)

static是一个声明,说明可以在类级别而不是实例级别调用此方法sampleTwosampleOne是实例方法,因此您需要实例化示例类的实例。

const test = Sample();
test.sampleOne(); //works
test.sampleTwo(); //won't work cause it is defined on class level

Sample.sampleOne(); //won't work cause not static defined
Sample.sampleTwo(); //works because it is static.

答案 3 :(得分:0)

静态方法未绑定到类实例。但是对于班级本身。因此,在方便的同时,您将无法访问this,因为没有实例可指向。

答案 4 :(得分:-1)

在类本身上调用静态方法。

例如,下面的方法可以很好地工作

Sample.sampleOne()
// undefined

同时

Sample.sampleTwo()
// this is a test two