Java-скрипт как объектно-ориентированный язык

Судя по всему, java-script — это объектно-ориентированный язык, то есть почти все является объектом. Но что это на самом деле означает? Позвольте мне показать вам на примере:

Итак, что я сделал, так это создал массив из трех цифр 1, 2 и 3. Теперь, когда я зарегистрировал свой массив, вы видите, что он отображается на консоли. Под прототипом вы также видите список методов, которые вы можете выполнять с моим массивом. Некоторые из этих методов — sort, push, pop и даже метод map, о котором я упоминал в своей прошлой статье.

Объектно-ориентированное программирование — это модель программирования, которая организует разработку программного обеспечения вокруг объектов. Объект — это, по сути, представление сущности или реального живого вещества. Теперь у этой сущности есть два свойства, атрибуты и методы. Атрибут - это то, что объект имеет с моим объектом массива, а атрибуты - это числа, которые я храню в нем. Метод — это то, что может делать объект. Как и в случае с моей сортировкой массива, это метод, и он сортирует мой массив. Теперь мы можем использовать эти знания для создания собственного объекта. С java-скриптом у нас есть несколько способов создать объект, но я расскажу только о двух.

1. Литерал объекта

let user = {
    name:"Superman",
    age:27,
    weakness:"Louis Lane",
    fly(){
        console.log(this.name + "is flying");
    },
    strength(){
        console.log(this.name + "is punchin you to next week");
    }
}

console.log(user);

Итак, что я сделал здесь, так это создал героя по имени Супермен и дал ему много крутых способностей.

Теперь, когда я запускаю этот код, используя node в моем коде vs, вы видите те же результаты, что и объект массива. Куча атрибутов и методов, которые может сделать мой герой. Но у нас есть проблема, а что, если я захочу создать еще одного героя, может быть, десять. Что, если я захочу создать всю Лигу справедливости, мне придется копировать, вставлять и вносить изменения, на которые у нас обоих нет времени. Так что, если есть другой способ сделать это.

Ну, это использование классов и конструкторов. Это означает, что я использую классы для разработки чертежа супергероя, а затем конструктор создает новый экземпляр объекта всякий раз, когда я хочу создать нового супергероя. Что-то вроде фабрики героев.

2. Объект с классами

class Hero {
    constructor(name,age,weakness){
        this.name = name;
        this.age = age;
        this.weakness = weakness;
    }

    fly(){
        console.log(this.name + " is flying");
    }

    strength(){
        console.log(this.name + " is punching to mid december");
    }
    
}

hero1 = new Hero("Superman",27,"Louis Lane");
hero2 = new Hero("Shazam",12,"Candy");

console.log(hero1);
console.log(hero1.fly());
console.log(hero2);
console.log(hero2.fly());

Что я только что сделал, так это создал чертеж супергероя, а затем изготовил двух очень крутых супергероев. Теперь с этим я мог создать 10, 20 или даже целую лигу справедливости без необходимости много копировать и вставлять.

Теперь, почему кто-то хочет сделать это? Что ж, помимо предотвращения того, чтобы ваша кодовая база выглядела как газетная статья или чтобы ваш код был организован таким образом, чтобы вносить в него изменения было так просто, четыре основных принципа объектно-ориентированного программирования являются основными причинами, по которым эта структура программирования очень важна для программиста. .

Абстракция

Абстракция — это принцип в oop (набирать объектно-ориентированный текст слишком долго), который направлен на то, чтобы скрыть необходимые данные о пользователе. Это позволяет пользователю выполнять более сложную логику без необходимости разбираться во всех скрытых сложностях. Допустим, мы хотим отправить супермена на криптон. Мы знаем, что когда мы вызываем функцию полета, мы можем заставить супермена летать, но как нам добавить пункт назначения?

class Hero {
    constructor(name,age,weakness){
        this.name = name;
        this.age = age;
        this.weakness = weakness;
    }

    fly(){
        return this.name + " is flying";
    }

    strength(){
        return this.name + " is punching to mid december";
    }
    
}

console.log(hero1.fly(),"to krypton");

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

Теперь, как вы можете видеть в наших выходных данных, супермен летит на криптон. Мне не обязательно знать логику функции fly, все, что мне нужно знать, это то, что она делает, и я добавил к ней больше логики.

Инкапсуляция

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

hero1.fly()
//This makes superman fly

Теперь, помимо того, что это лучший способ написания кода, эта концепция имеет много преимуществ, но из-за времени я выделю два:

  1. Инкапсуляция делает наш код очень простым в обслуживании. Если я хочу добавить новые способности своим героям, я добавляю их в класс. Если бы я хотел удалить их летающие способности, я мог бы удалить их из класса. Я мог бы даже изменить направление супермена с криптона на крепость одиночества, не нарушая функцию полета.
  2. Инкапсуляция также используется для ограничения доступа к определенным атрибутам и методам. Я мог бы использовать модификаторы доступа, чтобы скрыть определенную информацию. Например: я знаю, что у многих из вас может возникнуть соблазн изменить слабость супермена на криптон, хотя мы оба знаем, что это Луи Лейн, поэтому я бы сделал эту слабость личным модификатором. Это означает, что вы можете изменить его только из самого класса. Или я мог бы использовать защищенный модификатор, что означает, что я могу изменить слабость дочернего класса, но не из общего кода, и есть общедоступный модификатор, к которому вы можете иметь доступ из любого места.

Я знаю, что это может показаться запутанным, поэтому эта ссылка должна помочь.

Наследование

Это, вероятно, самый популярный объектно-ориентированный принцип с моей точки зрения. Наследование, как следует из названия, — это класс, наследующий другой класс. Новый класс называется родительским классом, а класс, который будет наследоваться от родительского класса, называется дочерним классом.

class Hero {
    constructor(name,age,weakness){
        this.name = name;
        this.age = age;
        this.weakness = weakness;
    }

    fly(){
        return this.name + " is flying";
    }

    strength(){
        return this.name + " is punching to mid december";
    }
    
}
class Villan extends Hero {
  constructor(name, age, weakness, madness){
    super(name,age,weakness);
    this.madness = madness
    }
    
    retreat(){
      return this.name + "has left the battle";
    }
}

lex = new Villian("Lex",39,"superman",35)
console.log(lex);
console.log(lex.fly())
console.log(lex.retreat());

Теперь я создал злодея класса, который наследует все атрибуты и методы героя начального класса. Я также добавил атрибут слабости и метод отступления, который есть только у злодея.

Как видите, мой злодей имеет доступ ко всем атрибутам героев, а также к их способности летать.

Полиморфизм

Это становится длинным, но я обещаю, что это последняя концепция, так что оставайтесь со мной. Полиморфизм — это просто выполнение действия в различных формах. Так что представьте на секунду, что я мог бы назвать функцию силы нашего героя в разных формах.

class Villian extends Hero {
    constructor(name, age, weakness, madness){
      super(name,age,weakness);
      this.weakness = weakness
      }

      strength(){
        return this.name + "punches with his left hand";
      }
      
      retreat(){
        return this.name + "has left the battle";
      }
  }

lex = new Villian("Lex",39,"superman",35)
hero1 = new Hero("Superman",27,"Louis Lane");

Поэтому я немного изменил нашу силовую функцию в классе злодеев, назвав ее для Супермена и Лекса. Как видите, одна и та же функция дает разные результаты. Я хотел бы, чтобы вы заметили, что изменение функции в классе Злодей не повлияло на класс Героя. Я мог бы создать еще один класс Бэтмена, а затем изменить силу той же функции на что-то другое, и это не повлияет на первые два. Теперь, как это полезно? Если вы сделали это с функциональным программированием, вы должны определить каждую функцию с разными именами, так как определение уже определенной функции даст вам ошибку.

Заключение

Ладно, на этом мои статьи заканчиваются. Обещаю, следующий будет короче, но не торопитесь и посмотрите это видео от Traversy media, где он углубляется. Удачного кодирования!!!!