Как именно работает параметр в "super" классов javascript?

В настоящее время я просматриваю официальное руководство по 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, я ожидал бы хаоса ^^

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
37
1

Ответы 1

В примере, предоставленном учебником 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 на самом деле не предназначен для расширения)

См. Этот ресурс, в котором опровергается разница между двумя концепциями.

Другие вопросы по теме