Функции-конструкторы объектов

Последнее обновление: 24.10.2023

Кроме создания новых объектов 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

Оператор 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
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850