You are currently viewing Введение в объектно-ориентированное программирование на JavaScript

Введение в объектно-ориентированное программирование на JavaScript

Поскольку JavaScript широко используется в веб-разработке, в этой статье мы рассмотрим некоторые объектно-ориентированные механизмы, поддерживаемые JavaScript, чтобы извлечь из этого максимальную пользу. Некоторые из распространенных вопросов для интервью в JavaScript на OOPS включают: “Как объектно — ориентированное программирование реализовано в JavaScript? Чем они отличаются от других языков? Можете ли вы реализовать наследование в JavaScript и так далее…”
Существуют определенные функции или механизмы, которые делают язык объектно-ориентированным, например:
 

  • Объект
  • Классы
  • Инкапсуляция
  • Наследование

Давайте углубимся в детали каждого из них и посмотрим, как они реализованы в JavaScript.

Объект – это уникальная сущность, содержащая свойства и методы. Например, “автомобиль” — это реальный объект, который имеет некоторые характеристики, такие как цвет, тип, модель, мощность и выполняет определенные действия, такие как привод. Характеристики объекта называются Свойством в объектно-ориентированном программировании, а действия называются методами. Объект-это экземпляр класса. Объекты есть везде в JavaScript почти каждый элемент является объектом,будь то функция, массивы или строка.
Примечание: Метод в javascript-это свойство объекта, значением которого является функция.
Объект может быть создан двумя способами в JavaScript:

  • Использование объектного литерала 
//Defining object
let person = {
	first_name:'Mukul',
	last_name: 'Latiyan',

	//method
	getFunction : function(){
		return (`The name of the person is
		${person.first_name} ${person.last_name}`)
	},
	//object within object
	phone_number : {
		mobile:'12345',
		landline:'6789'
	}
}
console.log(person.getFunction());
console.log(person.phone_number.landline);

Выход:

  • Использование конструктора объектов: 
//using a constructor
function person(first_name,last_name){
this.first_name = first_name;
this.last_name = last_name;
}
//creating new instances of person object
let person1 = new person('Mukul','Latiyan');
let person2 = new person('Rahul','Avasthi');

console.log(person1.first_name);
console.log(`${person2.first_name} ${person2.last_name}`);

Выход:

  • Используя метод Object.create (): Метод Object.create() создает новый объект, используя существующий объект в качестве прототипа вновь созданного объекта.
// Object.create() example a
// simple object with some properties
const coder = {
	isStudying : false,
	printIntroduction : function(){
		console.log(`My name is ${this.name}. Am I
		studying?: ${this.isStudying}.`)
	}
}
// Object.create() method
const me = Object.create(coder);

// "name" is a property set on "me", but not on "coder"
me.name = 'Mukul';

// Inherited properties can be overwritten
me.isStudying = true;

me.printIntroduction();

Выход:

Классы– Классы-это чертеж объекта. Класс может иметь много объектов, потому что класс-это шаблон, в то время как объект — это экземпляры класса или конкретной реализации.
Прежде чем мы перейдем к дальнейшей реализации, мы должны знать, что в отличие от других объектно-ориентированных языков в JavaScript нет классов, у нас есть только объект. Если быть более точным, JavaScript-это объектно-ориентированный язык на основе прототипа, что означает, что у него нет классов, а он определяет поведение с помощью функции конструктора, а затем повторно использует его с помощью прототипа.
Примечание: Даже классы, предоставляемые ECMA2015, являются объектами.

Пример:
Давайте использовать классы ES6, затем мы рассмотрим традиционный способ определения объектов и смоделируем их как классы.

// Defining class using es6
class Vehicle {
constructor(name, maker, engine) {
	this.name = name;
	this.maker = maker;
	this.engine = engine;
}
getDetails(){
	return (`The name of the bike is ${this.name}.`)
}
}
// Making object with the help of the constructor
let bike1 = new Vehicle('Hayabusa', 'Suzuki', '1340cc');
let bike2 = new Vehicle('Ninja', 'Kawasaki', '998cc');

console.log(bike1.name); // Hayabusa
console.log(bike2.maker); // Kawasaki
console.log(bike1.getDetails());

Выход:

Традиционный Способ.

// Defining class in a Traditional Way.
function Vehicle(name,maker,engine){
	this.name = name,
	this.maker = maker,
	this.engine = engine
};

Vehicle.prototype.getDetails = function(){
	console.log('The name of the bike is '+ this.name);
}

let bike1 = new Vehicle('Hayabusa','Suzuki','1340cc');
let bike2 = new Vehicle('Ninja','Kawasaki','998cc');

console.log(bike1.name);
console.log(bike2.maker);
console.log(bike1.getDetails());

Вывод:

  1. Как видно из приведенного выше примера, гораздо проще определить и повторно использовать объект в ES6. Следовательно, мы будем использовать ES6 во всех наших примерах.
  2. Инкапсуляция – Процесс упаковки свойств и функций в единое целое известен как инкапсуляция.
    Давайте разберемся в инкапсуляции на примере.
//encapsulation example
class person{
	constructor(name,id){
		this.name = name;
		this.id = id;
	}
	add_Address(add){
		this.add = add;
	}
	getDetails(){
		console.log(`Name is ${this.name},Address is: ${this.add}`);
	}
}

let person1 = new person('Mukul',21);
person1.add_Address('Delhi');
person1.getDetails();

Вывод:

В приведенном выше примере мы просто создаем объект person с помощью конструктора, инициализируем его свойство и используем его функции.Нас не беспокоят детали реализации. Мы работаем с интерфейсом объектов без учета деталей реализации.
Иногда инкапсуляция относится к сокрытию данных или абстракции данных что означает представление основных функций, скрывающих детали фона. Большинство языков ООП предоставляют модификаторы доступа для ограничения области действия переменной, но в JavaScript таких модификаторов доступа нет, но они являются определенным способом, с помощью которого мы можем ограничить область действия переменной в классе/объекте.
Пример:

// Abstraction example
function person(fname,lname){
	let firstname = fname;
	let lastname = lname;

	let getDetails_noaccess = function(){
		return (`First name is: ${firstname} Last
			name is: ${lastname}`);
	}

	this.getDetails_access = function(){
		return (`First name is: ${firstname}, Last
			name is: ${lastname}`);
	}
}
let person1 = new person('Mukul','Latiyan');
console.log(person1.firstname);
console.log(person1.getDetails_noaccess);
console.log(person1.getDetails_access());

Вывод:

В приведенном выше примере мы попробуем открыть некоторые свойства(человека 1.»имя») и функции(1, которое.getDetails_noaccess), но он возвращает сбросить , пока их это способ, которым мы можем получить от человека объекта(человека 1.getDetails_access()), изменяя способ, чтобы определить функцию, мы можем ограничить сферу его применения.

Наследование– Это концепция, в которой некоторые свойства и методы Объекта используются другим Объектом. В отличие от большинства языков ООП, где классы наследуют классы, объект JavaScript наследует объект, т. е. определенные функции (свойства и методы)одного объекта могут быть повторно использованы другими объектами.
Давайте разберемся в наследовании на примере:

//Inhertiance example
class person{
	constructor(name){
		this.name = name;
	}
	//method to return the string
	toString(){
		return (`Name of person: ${this.name}`);
	}
}
class student extends person{
	constructor(name,id){
		//super keyword to for calling above class constructor
		super(name);
		this.id = id;
	}
	toString(){
		return (`${super.toString()},Student ID: ${this.id}`);
	}
}
let student1 = new student('Mukul',22);
console.log(student1.toString());

Вывод:

В приведенном выше примере мы определяем объект Person с определенным свойством и методом, а затем наследуем объект Person в объекте Student и используем все свойства и методы объекта person, а также определяем определенные свойства и методы для Студента.
Примечание: Объект Person и объект Student имеют один и тот же метод, т. е. toString (), это называется переопределением метода. Переопределение метода позволяет методу в дочернем классе иметь то же имя и подпись метода, что и у родительского класса.
В приведенном выше коде ключевое слово super используется для ссылки на переменную экземпляра непосредственного родительского класса.