【问题标题】:What's the difference between static and instance members?静态成员和实例成员有什么区别?
【发布时间】:2019-04-03 16:04:48
【问题描述】:

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

class Sample{
  constructor(){}

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

【问题讨论】:

  • 一个在实例上调用,一个在类上调用。简单的搜索将回答这个问题。 (任何一个。)
  • 静态成员和实例成员有什么区别?”和“我应该什么时候使用静态成员?”是非常不同的问题。
  • p.s.w.g,是的,你说得对,我忘了改问题
  • @DaveNewton:“类”和“实例”并不完全适用于 Javascript(如果你真的想了解发生了什么)。

标签: javascript reactjs ecmascript-6


【解决方案1】:

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

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

第二个是静态方法,所以你不必有类的实例来调用它:

Sample.sampleTwo();

【讨论】:

  • Sample.prototype.sampleOne 怎么样?那里没有实例,但仍然是一个可用的方法。
  • @dandavis 好吧,它是可用的,因为该方法的主体没有提到this,所以就显示的示例而言,您是绝对正确的。但是,实际上不太可能有一个不使用this 的实例方法。如果是这样,将它包装在一个类中的意义何在?
  • 如果使用this,yopu可以调用/应用/绑定它。它与任何其他方法的用途相同......
【解决方案2】:

Javascript 没有类,因此对“类”和“实例”的解释是不准确的。在 javascript 中,只有对象,它们具有构造函数(函数)和原型(其他对象)。 ES6“类”语法只是一个装饰器,它简单地将类java的类声明翻译成原型,即:

  • 类变成构造函数(函数):

    class Sample => function Sample()
    
  • 普通方法附加到构造函数的prototype属性,稍后当你做new Sample()时复制到object.[[Prototype]]

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

    sampleTwo  => Sample.sampleTwo
    

插图:

【讨论】:

    【解决方案3】:

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

    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.
    

    【讨论】:

    • 不幸的是,我对 js 作为一种原型语言的了解有限。希望有人能提供答案。
    【解决方案4】:

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

    【讨论】:

    • Sample.prototype.sampleOne 呢?
    【解决方案5】:

    类本身调用静态方法。

    例如,以下将完美运行

    Sample.sampleOne()
    // undefined
    

    同时

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

    【讨论】:

    • @MaheerAli One 不是错字。虽然调用sampleOne() 会抛出错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多