Создание объектов в JavaScript: .prototype и var self = this

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Создание пользовательского объекта в JavaScript требует применения синтаксиса классов, который описывает конструктор и методы:

JS
Скопировать код
class CustomObject {
  constructor(value) {
    this.property = value;
  }

  method() {
    return this.property;
  }
}

const myObject = new CustomObject('example');
console.log(myObject.method()); // Вывод: 'example'

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

Кинга Идем в IT: пошаговый план для смены профессии

Средний уровень: Изучение разнообразных методов создания объектов

Синтаксис ES6 class и extends для наследования

Классы ES6 упрощают процесс создания объектов и реализацию наследования:

JS
Скопировать код
class ParentObject {
  constructor(name) {
    this.name = name;
  }
  
  greet() {
    return `Привет, меня зовут ${this.name}`;
  }
}

class ChildObject extends ParentObject {
  constructor(name, age) {
    super(name);
    this.age = age;
  }
  
  introduce() {
    return `${super.greet()}. Мне ${this.age} лет.`;
  }
}

const child = new ChildObject('Алиса', 5);
console.log(child.introduce()); // Вывод: 'Привет, меня зовут Алиса. Мне 5 лет.'

Использование прототипов для общего доступа к атрибутам

Прототипы используются для общего доступа к свойствам и методам между экземплярами:

JS
Скопировать код
function Animal(sound) {
  this.sound = sound;
}

Animal.prototype.speak = function() {
  return this.sound;
};

const dog = new Animal('гав');
console.log(dog.speak()); // Вывод: 'гав'

Использование замыканий для инкапсуляции данных

Замыкания позволяют скрывать информацию внутри функций, обеспечивая инкапсуляцию:

JS
Скопировать код
const createCounter = () => {
  let count = 0;
  return {
    increment() {
      count += 1;
    },
    getCount() {
      return count;
    },
  };
};

Определение статических методов и свойств

Статические методы и свойства принадлежат самиму конструктору, а не его экземплярам:

JS
Скопировать код
class Tool {
  static count = 0;
  constructor(name) {
    this.name = name;
    Tool.count++;
  }
}

const hammer = new Tool('Молоток');
console.log(Tool.count); // Вывод: 1

Продвинутый уровень: Секреты, парадигмы и потенциальные подводные камни

Приватные поля: хороший выбор для конфиденциальных данных в классах ES6

В классах JavaScript приватные поля скрывают определенные данные:

JS
Скопировать код
class MyClass {
  #privateField;
  
  constructor(value) {
    this.#privateField = value;
  }
  
  getPrivateField() {
    return this.#privateField;
  }
}

Сочетание парадигм для повышения надежности

Комбинирование различных техник создания объектов обеспечивает мощный и гибкий объектный дизайн:

JS
Скопировать код
class MixinBuilder {
  
  constructor(superclass) {
    this.superclass = superclass;
  }
  
  with(...mixins) {
    return mixins.reduce((c, mixin) => mixin(c), this.superclass);
  }
}

Визуализация

Продемонстрируем создание пользовательского объекта на примере костюма:

Часть костюмаКомпонент объекта
Ткань (👔)Свойства
Пуговицы (🔘)Методы
Швы (🧵)Инкапсуляция

Например:

JS
Скопировать код
function Suit(fabric, buttons) {
    this.fabric = fabric;
    this.buttons = buttons;
    
    this.wear = function() {
        console.log(`Надел мой ${this.fabric} костюм с ${this.buttons} пуговицами!`);
    };
}

new Suit('твид', 'латунные');

Фабрики, подводные камни и искусство композиции

Фабричные функции: массовое создание объектов

Фабричные функции представляют собой альтернативу ключевому слову new:

JS
Скопировать код
const createWidget = (type) => ({
  type,
  render() {
    console.log(`Отображение виджета ${type}.`);
  }
});

Избегаем подводных камней с this

Неправильное понимание контекста this может спровоцировать ошибки. Для решения этой проблемы можно применить стрелочные функции:

JS
Скопировать код
class Button {
  constructor(label) {
    this.label = label;
    this.click = () => {
      console.log(`Кнопка ${this.label} нажата`);
    };
  }
}

Предпочтительным выбором является динамическая композиция вместо статического наследования

Композиция объектов предоставляет большую гибкость для комбинирования различного поведения:

JS
Скопировать код
const canSpeak = (state) => ({
  speak: () => console.log(state.sound),
});

const dog = Object.assign({}, canSpeak({sound: 'гав'}));
dog.speak(); // Вывод: 'гав'

Полезные материалы

  1. Работа с объектами – JavaScript | MDNОфициальная документация MDN по созданию объектов.
  2. Понимание конструкторов в JavaScript | CSS-TricksПодробное руководство к пониманию конструкторов JavaScript.
  3. Приватные и публичные поля классов в JavaScript — Глубокое погружение в приватные поля в классах ES6.
  4. Создание объектов в JavaScript: Паттерны и лучшие практики — SitePointРазнообразные паттерны и лучшие практики создания объектов.