ООП в JS6
Привет, недавно написал про ООП в PHP, в принципе все то же самое только ком-то может быть будет легче воспринимать другой язык программирования. Тут же речь пойдет о JS.
Основы ООП
Есть классы и объекты.
Класс — это шаблон по которому строится объект. Это сущность, которая может выполнять какие-то свойства. Все что выполняет какие-либо действия это все классы.
Есть что-то общее это класс, а есть что-то частное персонализированное это есть экземпляр класса — объект. Ваш монитор, это есть объект класса Мониторы.
В ООП есть 3 основные принципы:
- наследование,
 - полиморфизм,
 - инкапсуляция.
 
Наследование
Есть общий класс (Человек), родительский, у него есть методы (ходить, есть, пить). В классах, методы, это те же самые функции.
Есть подклассы, охотник и доктор они выходят из класса человек и могут наследовать методы супер класса Человек, т.е. ходить, есть, пить.
Полиморфизм
Это уникальные описание свойств метода потомка. Т.е. выше есть подкласс Доктор, у этого подкласса есть свой подкласс Хирург у него есть тоже метод лечить, но он уже будет уникальным от других методов лечить, допустим врач дантист не может лечить так же как Хирург, разные направления.
Методы(функции) подклассов не доступны в их родителях, только в подклассах.
Полиморфизм — перелпределение метода(функции) с последующим дополнением, своебразное рашрениеметода.
Инкапсуляция
Ограничение доступа. Можно сделать методы(функции) открытии и закрытии, по умолчанию все функции открытые.
Прототип (__proto__) — дополнительные свойства объекта.
Если перед названием метода поставить нижне подчеркивание, то метод считается закрытым.
Практика
<script>
    class Person() //класс
    {
        constructor(name, year) //конструктор - свойства у объекта Person
        { 
            this.name = name; //свойства, поля класса
            this.year = year; 
        }
        calcAge() //метод для нахождения возраста
        {
            return new Date().getGullYear - this.year;
        }
        sayhi() // метод - функция приветствия
        {
            return `${this.name}, Hi!`;
        }
    }
    let user = new Person("Антон", 1990);
    console.log(`${user.name} имеет возраст ${user.calcAge()}`);
</script>
Статические методы
Статические методы привязаны к классу, а не статические к объекту класса.
<script>
    class Person() //класс 
    { 
        constructor(name, year) //конструктор - свойства у объекта Person 
       { 
           this.name = name; //свойства, поля класса 
           this.year = year; 
       } 
       calcAge() //метод для нахождения возраста 
       { 
           return new Date().getGullYear - this.year; 
       } 
       sayhi() // метод - функция приветствия 
       { 
          return `${this.name}, Hi!`; 
       } 
       static test(x)
       {
       return x*2;
      }
    } 
    let user = new Person("Антон", 1990); 
    console.log(`${user.name} имеет возраст ${user.calcAge()}`); 
    console.log(Person.test(20)); //вызов статического метода
</script>
Практика — наследование
<script>
    class Teacher extends Person
    {
        constructor(name,year, sybject)
        {
            super(name,year); //вызываем базовый конструктор класса Person
            this.sybject = sybject;
        }
    }
</script>
Практика полиформизм
<script>
    class Teacher extends Person
    {
        constructor(name,year, sybject)
        {
            super(name,year); //вызываем базовый конструктор
            this.sybject = sybject;
        }
        sayhi() // метод - функция приветствия 
        { 
           //console.log(`${this.name} имеет возраст ${this.calcAge()}`); 
           return `${super.sayhi()}, as  Teacher  Hi!`; 
        } 
    }
</script>
let user = new Teacher ("Ivan", 1192, "En Lang");
console.log(user.sayhi());
ПредыдущаяДля вызова методов или полей используется this если метод (функция) имеет одинаковое название, тогда используется слово super.






