ES6: это в статическом методе - PullRequest
0 голосов
/ 11 мая 2018

Допустим, у меня есть два класса ES6, как это:

class Base {
    static something() {
        console.log(this);
    }
}

class Derived extends Base {
}

И затем я делаю вызов, как это:

Derived.something();

Обратите внимание, что я звоню на статическийметод, определенный в суперклассе через подкласс.

Это не дает мне ошибки.Он печатает

[Function: Derived]

Так что доступ к this в статическом методе, кажется, работает здесь.

Мне нужен общий статический метод для всех подклассов суперкласса, и мне нужноуметь знать, какой подкласс вызывает этот метод.

Теперь мой вопрос: допустимо ли использование this в статическом методе.Я знаю, что эти статические методы становятся методами класса, и, следовательно, this будет естественно указывать на объект класса, к которому они обращаются.(Объект класса является конструктором.)

Но я не могу найти какой-либо определенный ресурс, который утверждает, что это разрешено спецификацией ES.

This выглядит как хорошее введение в классы ES6, но не говорит о this с static.

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Пока статический метод вызывается как выражение члена , например,

Derived.something();

в отличие от

const { something } = Derived;
something();

, тогда this будет означать Derived. Derived.something() идентичен something.call(Derived), если Derived.something сохраняется в промежуточной переменной, потому что именно так оценивается выражение члена с вложенным выражением вызова.

0 голосов
/ 11 мая 2018

Да, this допустимо в статических методах, вот как это должно быть сделано.

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

Аналогично, super ссылается на прототип родительского класса в методах экземпляра, а ссылается на конструктор родительского класса в статических методах .

0 голосов
/ 11 мая 2018

В типичных условиях вызов this in any для something.method() будет ссылаться на something, если функция не является функцией стрелки, связанной функцией или чем-то в этом роде (ив данном случае это ни то, ни другое).

Наследование классов, или даже ES6, здесь не очень актуально.Все, что вам нужно знать, это то, что вы звоните Derived.something(), поэтому this будет означать Derived.

...