Перво-наперво: что такое конструктор и зачем он нам нужен?

Javascript, в отличие от Ruby и многих других языков, изначально не поддерживает идею «классов». Конструктор — это функция, которая позволяет нам использовать сходное поведение и функциональность, которые классы предлагают многим другим языкам программирования. Конструктор в javascript — это просто функция, которая вызывается с ключевым словом new для создания экземпляра нового экземпляра вашего объекта или «класса», если хотите. Конструктор можно рассматривать как план, это способ упаковки свойств и поведения для повторного использования многими подобными объектами. Давайте посмотрим на быстрый пример.

function Dog(name,age,breed){
    this.name = name;
		this.age = age;
		this.breed = breed;
}
var fido = new Dog("Fido", 3, "Golden Retriever");
fido #=> Dog {name: "Fido", age: 3, breed: "Golden Retriever"}

Пока достаточно просто. У нас есть конструктор Dog() с параметрами имени, возраста и породы. Чтобы создать новый объект Dog, мы используем ключевое слово new и вызываем собаку, передавая три аргумента. Это создает новую собаку. В контексте функции-конструктора ключевое слово this не имеет значения. Вместо этого значение this становится вновь созданным объектом.

Хорошо, тогда что такое прототип?

Когда создается новый объект, этот новый объект наследует набор свойств от своего прототипа. Фактически все объекты наследуют набор свойств, включая свойство constructor, от своего прототипа.

var newString = new String("I am a new string!")
newString.constructor == String;                                             // true
fido.constructor == Dog;                                                              // true

Когда мы создавали экземпляр fido, в дополнение к установке свойств fido для аргументов, которые мы передавали, javascript также задавал специальное свойство constructor для fido, которое указывает на конструктор Dog!

Давайте сделаем еще один шаг вперед.

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

Dog.prototype.speak = function() {
    return "Arf, arf!"
}
fido.speak()                                                                                      // "Arf, arf!"

Как видите, адаптируя прототип, мы можем изменить поведение каждого экземпляра собаки даже после его создания. Мы могли бы даже добавить дополнительные свойства к нашему прототипу, а затем с изумлением наблюдать, как наши экземпляры собак унаследовали эти свойства!

Dog.prototype.legCount = 4;
fido.legCount                                                                                // 4
fido                                                                                                    
// Dog {name: "Fido", age: 3, breed: "Golden Retriever", legCount: 4}

Как аккуратно!?

Опубликовано cboujoukos 21 мая 2018 г.