Основи ООП Javascript.

ОООП. У JavaScript.

Об’єктно-орієнтоване програмування (ООП) — це парадигма програмування, яка використовує абстракції для створення моделей, заснованих на об’єктах реального світу.

ООП використовує кілька технік з раніше визнаних парадигм, включаючи успадкування, поліморфізм та інкапсуляцію.

У JavaScript спочатку було застосовано прототипне програмування.

Прототипне програмування

Прототипне програмування — це модель ООП, яка не використовує класи, а натомість спочатку виконує поведінку класу і потім використовує його повторно (еквівалент успадкування в мовах на базі класів), декоруючи (або розширюючи) існуючі об’єкти прототипи.

Принцип ООП полягає в тому, щоб складати систему з об’єктів, які вирішують прості завдання, які складають складну програму. Об’єкт складається з приватних змінних станів та функцій (методів), які працюють із цими станами. У об’єктів є визначення себе (self, this) і поведінка, успадковане від креслення, тобто. класу (класове наслідування) або інших об’єктів (прототипне наслідування).

Спадкування – спосіб сказати, що ці об’єкти схожі на інші за винятком деяких деталей. Спадкування дозволяє прискорити розробку рахунок повторного використання коду.

Функція – конструктор.

Виконується з ключовим словом new і зазвичай починається з великої літери.

function test() {
    this.name = 'Dima';
}

var me = new test();

При виклику з new створюється порожній об’єкт і в нього закидаються властивості з цього.

Створимо та експортуємо функцію в бібліотечному модулі.

export var Animal = function(name: string): void {
    this.name = name;
    this.show = function() {
        console.log('Drawing object..');
    };
}

Використання у клієнтському коді.

import { Animal } from "./lib";

var animal = new Animal('Muhtar');
console.log(animal);
animal.show();

Ми можемо визначити метод у прототипі функції, при цьому буде заощаджуватися пам’ять при успадкування.

export var Animal = function(name: string): void {
    this.name = name;
} 
Animal.prototype.show = function() {
    console.log('Drawing object..');
}

JS використовує дифіренційно успадкування, при якому методи не копіюються від батьків до нащадків, а натомість передається посилання на метод і нащадки мають приховане посилання на методи батьків.

Якщо тепер створити об’єкт animal.

var animal = new Animal('dog');

То об’єкт не матиме власного методу show.

animal.hasOwnProperty('show') === false

І коли ми звертаємося до якості, якої в об’єкті немає, то JS починає його шукати в ланцюжку прототипів (у батька).

Створення конструктора - спадкоємця. Метод Object.create()

При виклик такого методу.

 var parent = {
 foo: function() {
 console.log(‘bar’);
 }
};
var child = Object.create( parent );
child.hasOwnProperty(‘foo’); // false
child.foo(); // ‘bar’

Створюється новий порожній об’єкт і його прототип поміщається parent.

Таким чином ми можемо описати функцію-конструктор Dog з новими властивостями та перетягнувши властивості конструктора Animal.

export var Dog = function (name: string): void {
    this.bite = function(){
        console.log('Biting');
    }
    Animal.call(this,name);
}

А потім зв’язати їх за прототипом.

Dog.prototype = Object.create(Animal.prototype);