Перво-наперво: что такое конструктор и зачем он нам нужен?
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 г.