Концепция объектов и типов данных в JavaScript🗃️.
JavaScript известен своей парадигмой объектно-ориентированного программирования. В JavaScript большинство вещей можно рассматривать как объекты, включая массивы, функции и даже примитивные типы данных, такие как число, строка и логическое значение, когда они заключены в экземпляры объекта. Однако важно отметить, что не все в JavaScript является объектом, например неопределенные и нулевые значения. Понимание различий между объектами и другими типами данных в JavaScript необходимо для написания эффективного и действенного кода.
В JavaScript каждый объект имеет свойство prototype
, которое ссылается на прототип объекта. Прототип — это объект, содержащий свойства и методы, которые может использовать объект. Это позволяет использовать наследование на основе прототипов в JavaScript.
В наследовании на основе прототипа свойство constructor
является свойством объекта-прототипа, которое ссылается на функцию-конструктор, используемую для создания объектов, наследуемых от этого прототипа. Это свойство часто используется для проверки типа объекта и создания новых экземпляров того же типа с помощью ключевого слова new
.
давайте визуализируем это в Dev-tools.
Связывание прототипов
Теперь, когда у нас есть понимание основных основ объектов и прототипов в JavaScript, мы можем продемонстрировать это, создав функцию Product
в JavaScript для изучения многоуровневого наследования.
function Product(n, p) { this.name = n; this.price = p; } //Output //undefined -> Object Created Product.prototype //Output //{constructor:f} //an object with properties have been created
После создания функции продукта теперь мы создаем новое унаследованное имя объекта iPhone.
const iPhone = new Product("iPhone14",100000);
Теперь мы создадим метод display() в Product с помощью прототипа. Создание метода display()
в Product
с помощью прототипа позволяет добавить этот метод в объект-прототип Product
. В результате все экземпляры Product
, включая ваш объект iphone
, наследуют этот метод и смогут его использовать. Это помогает избежать избыточности кода, позволяя определить метод один раз в прототипе, а не для каждого отдельного экземпляра Product.
.
Product.prototype.display = function(){ console.log("Details of the product are", this); } //Output in Console ƒ (){ console.log("Details of the product are", this); }
Теперь мы можем использовать iPhone.display();
и показать детали моего продукта
iPhone.display(); //Output Details of the product are Product {name: 'iPhone14', price: 100000}
если сейчас мы попытаемся использовать метод toString();
в iPhone, это не сработает
iPhone.toString(); //Output //'[object Object]'
чтобы сделать его доступным, нам нужно вызвать из основного Object.prototype
Product.prototype.toString = function(){ console.log(this); } //Output ƒ (){ console.log(this); } //Now we can access toString propertie iPhone.toString(); //Output Product {name: 'iPhone14', price: 100000}
и вот как работаетцепочка прототипов. Это помогает создать привязку между методами и объектами, упрощая написание эффективного и действенного кода.
И если мы расширим вывод iPhone.toString();
, мы увидим имя объекта [[Prototype]], покажет связь Object.prototype
to Product.prototype
Мы также можем видеть, что родителем iPhone является объект Product.prototype
. напишите приведенный ниже код в консоли, чтобы увидеть это
iPhone.__proto__ //this will return the Product.prototype Object in the console iPhone.__proto__.constructor //will point to the main Product function
Что такое Dunder proto __proto__
?
__proto__
(dunder proto) — это способ наследования свойств объекта в JavaScript. __proto__
(dunder proto) свойство объекта. прототип — это свойство доступа, которое предоставляет [[Prototype]] объекта, через который к нему обращаются. Этот __proto__
(dunder proto) устанавливает все свойства объекта, установленные в его [[Prototype]], для целевого объекта. (Относится к родителю)
Многоуровневое наследование
Теперь, когда у нас есть понимание того, как работает цепочка прототипов, мы можем изучить, как многоуровневое наследование происходит в функциональном программировании.
//1st function function Product(){} //Output //undefined //setting a prototype method named details Product.prototype.details = function () { console.log("iPhone14"); } //Output //ƒ () { // console.log("iPhone14"); //} //2nd function function Mobile(){ } undefined //Setting inheritance between product and mobile Object.setPrototypeOf(Mobile.prototype, Product.prototype); Product {constructor: ƒ}constructor: ƒ Mobile()[[Prototype]]: Object //Created a new Object name show with the help of Mobile show = new Mobile() Mobile {} //Now we can call product.prototype method name detail to show the Mobile details show.details(); //Output //iPhone14
В этом фрагменте кода у нас есть две функции: Product
и Mobile
. Мы устанавливаем метод прототипа с именем details
в функцию Product
. Затем мы устанавливаем наследование между Product.prototype
и Mobile.prototype
с помощью Object.setPrototypeOf()
.
Затем мы создаем новый объект с именем show
, используя функцию-конструктор Mobile
. Поскольку Mobile
наследуется от Product
, мы можем вызвать метод details()
для show
, чтобы отобразить сведения о мобильном телефоне, который выводит «iPhone14».
В целом это демонстрирует, как наследование на основе прототипов работает в JavaScript и как мы можем использовать его для создания более эффективного кода путем совместного использования методов между объектами.
Вот блок-схема кода: -
В заключение, понимание объектов и прототипов в JavaScript имеет решающее значение для написания эффективного и действенного кода. Используя принципы наследования на основе прототипов и цепочки прототипов, мы можем создавать сложные и динамичные приложения. Я надеюсь, что вы нашли эту статью информативной и полезной. Если да, пожалуйста, поставьте лайк и поделитесь с другими.🙏