Главная » Объектно-ориентированное программирование и прототипно-ориентированное наследование.

Объектно-ориентированное программирование и прототипно-ориентированное наследование.


18.03.2021, 23:24
JavaScript - это объектно-ориентированный язык, в котором объектам отводится главная роль.

Пример-абстракция:

Объект: легковой автомобиль
Свойства объекта: двигатель, кузов, колёса
Методы объекта: езда, перевозка грузов и людей

Смысл ООП в представлении любого предмета в виде объекта с набором свойств и методов.

Строка (String) относится к примитивным типам данных, но при вызове какого-то метода для неё, строка оборачивается в объект, затем используется какой-то метод этого объекта, после чего строка снова становится примитивным типом данных:

Код

let str = 'some';
let strObj = new String(str);

console.log(typeof(str)); /* string */
console.log(typeof(strObj)); // => object

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

Прототипом массива является Array.prototype, у котого, в свою очередь, прототипом будет Object.prototype

Все конструкции прототипно наследуются от объекта и работа идёт по цепочке прототипов.

В программировании также можно создавать объекты, прототипно-наследуемые друг от друга.

Пример: записываем базовый объект (он будет прототипом)

Код

const warrior = {
  health: 400,
  armor: 100
};  

Теперь прописываем отдельного "бойца" с именем John:

Код

const john = {
  health: 100
};

Прототипное наследование дает возможность отдельному бойцу, помимо собственных "умений", использовать "умения" базового прототипа (его свойства и методы).

Как это делается в устаревшем формате:

Код

john.__proto__ = soldier; // => установили прототипом для john объект soldier

Если мы сейчас выведем в консоль значение свойства armor для объекта john (хотя его в объекте этом изначально нет) :

Код

const soldier = {
  health: 400,
  armor: 100
};

const john = {
  health: 100
};

john.__proto__ = soldier;

console.log(john.armor); // => 100

то увидим итоговый результат 100, а это значение свойства armor объекта soldier, значит объект john унаследовал от прототипа его свойство.

Добавим объекту-прототипу soldier какой-нибудь метод и вызовем его для объекта john

Код

const soldier = {
  health: 400,
  armor: 100,
  sayHello: function() {
  console.log('Hello, World');
  }
};

const john = {
  health: 100
};

john.__proto__ = soldier;

john.sayHello(); // => Hello, World

Метод выше устаревший и сейчас не используется, вместо этого используются методы Object.create(), Object.getPrototypeOf() и Object.setPrototypeOf()

Первый создаёт объект с определённым прототипом, второй получает этот прототип, третий - устанавливает прототип.

Код

Object.setPrototypeOf(john, soldier);

Эта запись эквивалентна устаревшему коду, написанному нами выше:

Код

john.__proto__ = soldier;

Обычно установка прототипа происходит на этапе создания объекта:

Код

const john = Object.create(soldier); // => создаём объект, прототипно наследуемый от soldier

КОММЕНТАРИИ (0)

РЕЙТИНГ МАТЕРИАЛА (0.0 / 0)