Javascript: прототип

Прототип - это свойство любой функции JavaScript, которая указывает на объект.

# Начнем с очень простого примера

function Student() {
    this.name = 'Harry';
    this.gender = 'Potter';
}
var studObj1 = new Student();
stdObj1.age = 15;
console.log(stdObj1.age); 
// 15
var stdObj2 = new Student();
console.log(stdObj2.age); 
// undefined

Как вы можете видеть в приведенном выше примере, свойство age прикреплено к экземпляру stdObj1. Однако у экземпляра stdObj2 не будет свойства age, поскольку оно определено только в экземпляре studObj1. Итак, что делать, если мы хотим добавить новые свойства на более позднем этапе к функции, которая будет использоваться всеми экземплярами? Ответ: Прототип.

function Student() {
    this.name = 'Harry';
    this.gender = 'Potter';
}
Student.prototype.age = 15;
var studObj1 = new Student();
console.log(studObj1.age); 
// 15
var studObj2 = new Student();
console.log(studObj2.age);
 // 15

# Как вы можете видеть в приведенном выше примере, к свойству prototype функции можно получить доступ с помощью ‹function-name› .prototype. Однако объект (экземпляр) не предоставляет свойство прототипа, вместо этого вы можете получить к нему доступ, используя __proto__

function Student() {
    this.name = 'Tom';
    this.gender = 'Cruise';
}
var studObj = new Student();
console.log(Student.prototype); 
// [object Object]
console.log(studObj.prototype); 
// undefined
console.log(studObj.__proto__); 
// [object Object]
console.log(typeof Student.prototype); 
// object
console.log(typeof studObj.__proto__); 
// object

### Изменение прототипа

прототип каждого объекта связан с объектом прототипа функции. Если вы измените прототип функции, то только новые объекты будут связаны с измененным прототипом. Все остальные существующие объекты по-прежнему будут ссылаться на старый прототип функции. Следующий пример демонстрирует этот сценарий.

function Student() {
    this.name = 'Tom';
    this.gender = 'Male';
}
Student.prototype.age = 15;
var studObj1 = new Student();
console.log('studObj1.age = ' + studObj1.age);
 // 15
var studObj2 = new Student();
console.log('studObj2.age = ' + studObj2.age);
 // 15
Student.prototype = { age: 20 };
var studObj3 = new Student();
console.log('studObj3.age = ' + studObj3.age);
 // 20
console.log('studObj1.age = ' + studObj1.age);
 // 15
console.log('studObj2.age = ' + studObj2.age);
 // 15

### Использование прототипа

Объект-прототип используется движком JavaScript для двух целей: 1) для поиска свойств и методов объекта 2) для реализации наследования в JavaScript.

function Student() {
    this.name = 'Robert';
    this.gender = 'Pattinson';
}
Student.prototype.sayHi = function () {
    console.log("Hi");
};
var studObj = new Student();
studObj.sayHi();
// Hi

### Поделиться методом с помощью прототипа

function Person(name, age){
    name = name;
    age= age;
}
Person.prototype = {
    eat(){
        console.log('Person is eating');
    },
    sleep(){
        console.log('Person is sleeping');
    },
    play(){
        console.log('Person is playing');
    }
}
const harry = new Person("Harry", 36);
harry.eat();
//Person is eating