Методы класса, объявленные таким образом, лежат в прототипе (каждый такой метод будет общий для всех экземпляров). Они созданы и существуют ещё до того, как будут созданы экземпляры класса. Соответсвенно, this внутри них не может сам по себе указывать на экземпляр, только если не задать его явно - при вызове через точку, через квадратные скобки, или с помощью call/apply/bind.
Можно объявить методы как стрелочные функции - это современный подход.
class ClassCounter extends React.Component {
...
increment = () => {
console.log(this);
this.setState({ count: this.state.count + 1 });
};
что практически то же самое, как если бы ты прямо в конструкторе написал
class ClassCounter extends React.Component {
constructor(props) {
super(props);
this.increment = () => {
console.log(this);
this.setState({ count: this.state.count + 1 });
};
}
то есть такие методы создаются в момент создания экземпляра (на каждый экземпляр заново создается каждый стрелочный метод), ну и автоматически биндят this по правилам стрелочных функций, то есть this с места вызова - внутри конструктора