Кроме создания новых объектов JavaScript предоставляет нам возможность создавать новые типы объектов с помощью специальных функций - конструкторов. Конструктор позволяет определить новый тип объекта. Определение типа может состоять из функции конструктора, методов и свойств.
Для начала определим конструктор:
function Person(pName, pAge) { this.name = pName; this.age = pAge; this.print = function(){ console.log("Name: ", this.name); console.log("Age: ", this.age); }; }
Конструктор - это обычная функция за тем исключением, что в ней мы можем установить свойства и методы. Для установки свойств и методов используется ключевое слово this:
this.name = pName;
В данном случае устанавливаются два свойства name и age и один метод print.
Как правило, названия конструкторы в отличие от названий обычных функций начинаются с большой буквы.
После этого в программе мы можем определить объект типа Person и использовать его свойства и методы:
// определение конструктора объектов типа Person function Person(pName, pAge) { this.name = pName; this.age = pAge; this.print = function(){ console.log(`Name: ${this.name} Age: ${this.age}`); }; } // определение объекта типа Person const tom = new Person("Tom", 39); // обращение к свойству объекта console.log(tom.name); // Том // обращение к методу объекта tom.print(); // Name: Tom Age: 39
Чтобы вызвать конструктор, то есть создать объект типа Person, надо использовать ключевое слово new:
const tom = new Person("Tom", 39);
Далее через имя объекта можно обращаться к его свойствам и методам, которые определены внутри функции конструктора:
// обращение к свойству объекта console.log(tom.name); // Том // обращение к методу объекта tom.print();
Стоит отметить, что, конечно, мы могли бы определить объект стандартным образом:
const tom = { name: "Tom", age: 39, print: function(){ console.log(`Name: ${this.name} Age: ${this.age}`); } }
Однако использование функций-конструкторов позволяет упростить многократное создание однотипных объектов, которые имеют одинаковый набор свойств и методов. То есть фактически мы определяем новый тип объектов. Например:
function Person(pName, pAge) { this.name = pName; this.age = pAge; this.print = function(){ console.log(`Name: ${this.name} Age: ${this.age}`); }; } const tom = new Person("Tom", 39); const bob = new Person("Bob", 43); const sam = new Person("Sam", 28); tom.print(); // Name: Tom Age: 39 bob.print(); // Name: Bob Age: 43 sam.print(); // Name: Sam Age: 28
Объекты подобных типов можно также передавать в функции или возвращать из функций, они могут выступать в качестве свойств других объектов, могут храниться в массивах и т.д. Например:
function Person(pName, pAge) { this.name = pName; this.age = pAge; this.print = function(){ console.log(`Name: ${this.name} Age: ${this.age}`); }; } function printPersonName(person){ console.log(person.name); } // массив из трех объектов Person const people = [new Person("Tom", 39), new Person("Bob", 43), new Person("Sam", 28)]; for(person of people){ printPersonName(person); }
Оператор instanceof позволяет проверить, с помощью какого конструктора создан объект. Если объект создан с помощью определенного конструктора, то оператор возвращает true:
// определение конструктора объектов типа Person function Person(pName, pAge) { this.name = pName; this.age = pAge; this.print = function(){ console.log(`Name: ${this.name} Age: ${this.age}`); }; } // определение конструктора объектов типа Employee function Employee(eName, eCompany) { this.name = eName; this.company = eCompany; this.print = function(){ console.log(`Name: ${this.name} Company: ${this.company}`); }; } const tom = new Person("Tom", 39); const bob = new Employee("Bob", "Google"); console.log(tom instanceof Person); // true - tom является объектом типа Person console.log(bob instanceof Employee); // true - bob является объектом типа Employee console.log(tom instanceof Employee); // false - tom НЕ является объектом типа Employee