Ако сте разработчик на JavaScript, вероятно сте чували за прототипно наследяване. Това е основна концепция в JavaScript, която често се използва за създаване на сложни приложения. Въпреки това, разбирането на прототипното наследяване може да бъде предизвикателство за начинаещи. В тази публикация в блога ще обясним прототипното наследяване с прости думи и ще обсъдим начините, по които можете да създавате наследени класове в JavaScript.

Какво е прототипно наследяване?

Прототипното наследяване е начин за създаване на обекти в JavaScript. За разлика от класическото наследяване в обектно-ориентирани езици за програмиране като Java и C++, то не включва създаване на план за клас. Вместо това създавате обект, който служи като прототип за други обекти. С други думи, вместо да създавате план за клас, вие създавате обект, от който други обекти наследяват.

Създаване на наследени класове в JavaScript

След като вече знаете какво е прототипно наследяване, нека обсъдим начините, по които можете да създавате наследени класове в JavaScript.

Конструкторски функции

Конструкторските функции се използват за създаване на обекти със специфичен набор от свойства и методи. За да създадете функция конструктор за обект, вие използвате ключовата дума „function“, последвана от името на функцията конструктор. След това можете да използвате свойството „прототип“, за да добавите методи и свойства към прототипа на този обект. Това позволява на всички обекти, създадени от тази конструкторска функция, да наследяват тези свойства и методи.

function Animal(name) {
  this.name = name;
}

Animal.prototype.sayName = function() {
  console.log("My name is " + this.name);
}

function Dog(name, breed) {
  Animal.call(this, name);
  this.breed = breed;
}

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

Dog.prototype.bark = function() {
  console.log("Woof! I'm a " + this.breed);
}

let myDog = new Dog("Rufus", "Labrador Retriever");

myDog.sayName(); 
// My name is Rufus
myDog.bark(); 
// Woof! I'm a Labrador Retriever

Object.create()

Методът Object.create() ви позволява да създадете нов обект и да посочите неговия прототип. Това може да бъде полезно за създаване на обекти, които наследяват от конкретен обект. За да създадете обект с помощта на Object.create(), подавате обекта, който искате да използвате като прототип, като първи аргумент.

let myPrototype = {
  sayHello: function() {
    console.log("Hello!");
  }
};

let myObject = Object.create(myPrototype);

myObject.sayHello(); 
// Hello!

Синтаксис на класа

Синтаксисът на класа, въведен в ES6, е друг начин за създаване на класове, които използват прототипно наследяване. Дефинирате клас с конструкторска функция и прототипни методи и след това използвате ключовата дума „extends“, за да създадете подклас, който наследява от родителския клас.

class Dog extends Animal {
  constructor(name, breed) {
    super(name);
    this.breed = breed;
  }

  bark() {
    console.log("Woof! I'm a " + this.breed);
  }
}

let myDog = new Dog("Rufus", "Labrador Retriever");

myDog.sayName(); 
// My name is Rufus
myDog.bark(); 
// Woof! I'm a Labrador Retriever

Фабрични функции

Фабричните функции са функции, които създават и връщат обекти. За да създадете фабрична функция, която създава обекти със специфичен набор от свойства и методи, вие дефинирате функцията и след това използвате метода „Object.assign()“, за да добавите тези свойства и методи към прототипа на обекта.

function createAnimal(name) {
  let animal = {
    name: name,
    eat: function() {
      console.log("Nom nom nom");
    }
  };

  return animal;
}

function createDog(name, breed) {
  let dog = createAnimal(name);

  dog.breed = breed;

  dog.bark = function() {
    console.log("Woof! I'm a " + this.breed);
  };

  return dog;
}

let myDog = createDog("Fido", "Labrador Retriever");

console.log(myDog.name); // Output: Fido
myDog.eat(); 
// Nom nom nom
myDog.bark(); 
// Woof! I'm a Labrador Retriever

Прототипното наследяване е мощна функция на JavaScript, която ви позволява да създавате обекти, които наследяват свойства и методи от прототип на обект. Като разберете начините, по които можете да създавате наследени класове в JavaScript, можете да използвате тази функция за създаване на сложни и мащабируеми приложения.