В настоящее время я просматриваю официальное руководство по responseJS: https://reactjs.org/tutorial/tutorial.html Хотя я не новичок в javascript, я все еще неопытен во многих аспектах, и это особенно верно для части javascript ООП.
Я как раз недавно как супер в принципе работает. Глядя на официальный API здесь https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/super и здесь: https://developer.mozilla.org/de/docs/Web/JavaScript/Inheritance_and_the_prototype_chain
Я узнал, что super вызывает конструктор родительского класса. Поэтому, когда я расширяю класс, я могу использовать super (), чтобы определить, что вводится в конструктор родительского класса.
Теперь посмотрим на этот пример из https://developer.mozilla.org/de/docs/Web/JavaScript/Inheritance_and_the_prototype_chain:
"use strict";
class Polygon {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
class Square extends Polygon {
constructor(sideLength) {
super(sideLength, sideLength);
}
get area() {
return this.height * this.width;
}
set sideLength(newLength) {
this.height = newLength;
this.width = newLength;
}
}
var square = new Square(2);У квадратного класса есть конструктор, который помещает свои входные данные в два параметра конструктора родительского класса. Мне это кажется совершенно нормальным, поскольку все параметры конструктора родительского класса учитываются функцией super ().
Однако когда я смотрю на этот пример из учебника по reactJS, я немного сбит с толку:
class Square extends React.Component {
constructor(props) {
super(props);
this.state = {
value: null,
};
}
render() {
return (
<button
className = "square"
onClick = {() => this.setState({value: 'X'})}
>
{this.state.value}
</button>
);
}
}Здесь вызывается конструктор класса Component, и в него вставляется параметр props. Однако, поскольку я ничего не знаю о конструкторе класса компонентов "vanilla", мне интересно, как это на самом деле может работать? Oo Хорошо, может быть, у конструктора класса компонента нет параметров "по умолчанию", тогда все в порядке. Но если это не так, как конструктор знает, как обрабатывать этот новый параметр? Будет ли он «перезаписывать» первый или второй уже существующий параметр, или он должен просто добавить новый параметр в существующий список параметров.
Предположим, что конструктор класса компонента по умолчанию «пустой». Когда я начал расширять этот класс и уже добавил, скажем, три параметра в его конструктор, как он узнает, как обрабатывать четвертый или пятый параметр и так далее? Глядя на поведение общих функций javascript, я ожидал бы хаоса ^^



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В примере, предоставленном учебником ReactJS, Square расширяет Component.
При создании нового компонента React необязательно переопределять конструктор, но если вы это сделаете, вы ДОЛЖНЫ вызвать super(props), потому что в противном случае базовый класс Component не будет должным образом инициализирован (в этом случае компонент не получит пропсы, переданные ему до это первый рендер, что было бы плохо).
Вы не создаете экземпляр компонента React самостоятельно, вызывая new MyComponent(props), но React сделает это при вызове React.createElement или при использовании jsx <MyComponent {...props} />.
В более общем смысле, если вы расширяете класс, вы должны знать класс, который вы расширяете, который включает параметры, требуемые конструктором.
Если вы переопределяете конструктор класса, вы должны соблюдать контракт документации класса. Это включает вызов базового конструктора. Если базовый конструктор что-то делает, вы должны поддерживать то, что он делает, явно вызывая его.
Часто то же самое происходит и с замещающими методами: если вы хотите сохранить начальную функцию метода, вы должны вызвать его в замещенной версии.
anOverridenMethod(...arguments) {
doSomethingBefore();
super.anOverridenMethod(...arguments);
doSomethingAfter();
}
Но на самом деле в React большинство переопределяемых методов (componentWillReceiveProps, shouldComponentUpdate ...) вообще не имеют реализации, поэтому вам не нужно беспокоиться о вызове базового метода. Поэтому наиболее распространенный вариант использования super - в конструкторе.
Тем не менее, в React композиция предпочтительнее наследования (компонент React на самом деле не предназначен для расширения)
См. Этот ресурс, в котором опровергается разница между двумя концепциями.