В чем разница между статическими и экземплярами? - PullRequest
0 голосов
/ 03 апреля 2019

Я хочу знать, в чем разница между этими двумя функциями в этом примере класса в JavaScript?

class Sample{
  constructor(){}

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

Ответы [ 5 ]

2 голосов
/ 03 апреля 2019

Javascript не имеет классов, поэтому объяснения в терминах «класс» и «экземпляр» неточны. В javascript есть только объекты, которые имеют конструкторы (функции) и прототипы (другие объекты). Синтаксис ES6 "class" - это просто декоратор, который просто переводит объявления классов в стиле java в прототипы, а именно:

  • классы превращаются в конструкторы (функции):

    class Sample => function Sample()
    
  • обычные методы присоединяются к свойству prototype конструктора и копируются в object.[[Prototype]] позже, когда вы делаете new Sample():

    sampleOne  => Sample.prototype.sampleOne
    
  • «статические» методы присоединяются непосредственно к конструктору:

    sampleTwo  => Sample.sampleTwo
    

Иллюстрация:

enter image description here

2 голосов
/ 03 апреля 2019

Первый - это метод экземпляра . Это означает, что вам нужно создать новый экземпляр класса Sample, чтобы вызвать его:

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

Второй - статический метод , поэтому вам не нужно иметь экземпляр класса для его вызова:

Sample.sampleTwo();
0 голосов
/ 03 апреля 2019

Статические методы вызываются для самого класса.

Например, следующее будет прекрасно работать

Sample.sampleOne()
// undefined

, тогда как

Sample.sampleTwo()
// this is a test two
0 голосов
/ 03 апреля 2019

Статические методы не привязаны к экземпляру класса. Но для самого класса. Таким образом, хотя это удобно, у вас не будет доступа к this, так как нет экземпляра, на который можно указать.

0 голосов
/ 03 апреля 2019

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...