Отличная статья и очень хорошо объяснено

Я хочу добавить, что в JavaScript не существует функций-конструкторов, однако, когда вы помещаете ключевое слово new перед обычным вызовом функции, это делает вызов функции «вызовом конструктора», например:

function Dummy(){
  console.log("Foo");
}
const d = new Dummy(); // "Foo"
console.log(d); // "{}"

Dummy — это обычная обычная функция, но когда она вызывается с new, она конструирует объект, почти как побочный эффект, поэтому вызов был вызовом конструктора, но Dummy сам по себе не является конструктором.

Также свойство constructor в новом созданном объекте может немного вводить в заблуждение, потому что, как и в JavaScript, нет классов, просто объектов, связанных с другими объектами (OLOO) через цепочку прототипов, информация, которая даст constructor, в некоторых случаях может быть не такой, как ожидалось:

function Person(name){
  this.name = name;
}
Person.prototype = {
  sayHello(){
    console.log(`Hello my name is ${this.name}`);
  }
}
const bob = new Person("Bob");
console.log(bob.sayHello()); // "Hello my name is Bob"
console.log(bob.constructor); // "[Function: Object]" 

Как видно из bob, у нас есть функция sayHello, определенная в prototype функции Person, но свойство constructor не возвращает ожидаемое значение, потому что при создании его прототипа мы сделал объявление нового объекта, для которого мы не указали свойство constructor, которое устанавливается каждый раз, когда движок создает новую функцию, способ исправить это и получить ожидаемый результат - объявить свойство constructor прототипа самостоятельно, но это может быть несколько неудобно, потому что это свойство должно быть настраиваемым, доступным для записи, но не перечисляемым, поэтому мы должны использовать Object.defineProperty для правильной настройки дескрипторов свойств и т. д.

По этой и другим причинам рекомендуется избегать использования классического наследования в JavaScript, как мы знаем его в других языках, таких как Java или C#, и научиться лучше думать о наследовании на основе прототипов. Также рекомендуется создавать новые объекты через композицию вместо наследования, это не является чем-то новым в Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения, банда четырех мы можем найти это предложение:

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

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

Одна из лучших книг, которые я нашел на эту тему, — здесь