متدهای شیء (Object Methods) در جاوا اسکریپت — به زبان ساده
یک شی در مفهوم کلاس در برنامه نویسی نمود دارد. اشیا در جاوا اسکریپت مجموعهای از جفتهای کلید/مقدار هستند. این مقادیر میتوانند شامل مشخصات و متدها باشند و همچنین ممکن است شامل انواع داده دیگر جاوا اسکریپت مانند رشتهها، اعداد و مقادیر بولی باشند. همه اشیا در جاوا اسکریپت از سازنده (Constructor) برای Object والد ساخته میشوند. این Object متدهای داخلی بسیار مفیدی دارد که میتوانیم برای دسترسی به آن استفاده کنیم و اشیای دیگر مفیدی بسازیم. برخلاف متدهای پروتوتایپ آرایه مانند ()sort و ()reverse که در وهلههای آرایه مورد استفاده قرار میگیرند، متدهای شیء به طور مستقیم روی سازنده شیء استفاده میشوند و از وهله شیء به عنوان یک پارامتر استفاده میشود. این روش به نام متد استاتیک خوانده میشود.
در این راهنما متدهای مهم داخلی شیء جاوا اسکریپت را بررسی میکنیم. در هر یک از بخشهایی که در ادامه ارائه شده یک متد خاص بررسی میشود و نمونهای از کاربرد آن توضیح داده میشود.
پیشنیازها
برای این که بیشترین بهره را از این راهنما داشته باشید، میبایست با مراحل ایجاد، تغییر و کار کردن با شیءها آشنا باشید. به این منظور میتوانید از این آموزش رایگان فرادرس کمک بگیرید.
برای این که به طور کلی اطلاعات بیشتری در مورد جاوا اسکریپت به دست آورید، میتوانید از این آموزش استفاده کنید.
()Object.create
متد ()Object.create برای ایجاد یک شیء جدید و پیوند دادن آن به پروتوتایپ یک شیء موجود استفاده میشود. ما میتوانیم یک وهله از شیء job را ایجاد کرده و آن را به شیء خاصی بسط دهیم:
// Initialize an object with properties and methods const job = { position: 'cashier', type: 'hourly', isAvailable: true, showDetails() { const accepting = this.isAvailable ? 'is accepting applications' : "is not currently accepting applications"; console.log(`The ${this.position} position is ${this.type} and ${accepting}.`); } }; // Use Object.create to pass properties const barista = Object.create(job); barista.position = "barista"; barista.showDetails();
خروجی
The barista position is hourly and is accepting applications.
شیء barista اینک یک خصوصیت به نام «position» دارد؛ اما همه خصوصیات و متدهای دیگر مربوط به job هستند که از طریق پروتوتایپ در دسترس هستند. ()Object.create برای کدنویسی DRY از طریق کاهش کپیها مفید است. کدنویسی DRY (اختصاری برای do not repeat yourself) مفهومی در زمینه توسعه نرمافزار است که هدف آن کاهش تکرار الگوهای کد، استفاده بیشتر از تجرید و اجتناب از افزونگی است.
()Object.keys
متد ()Object.keys یک آرایه ایجاد میکند که حاوی کلیدهای یک شیء است. ما میتوانیم یک شیء را ایجاد کرده و آرایههای کلیدها را نمایش دهیم.
// Initialize an object const employees = { boss: 'Michael', secretary: 'Pam', sales: 'Jim', accountant: 'Oscar' }; // Get the keys of the object const keys = Object.keys(employees); console.log(keys);
خروجی
["boss", "secretary", "sales", "accountant"]
متد Object.keys میتواند در یک حلقه قرار گیرد و کلیدها و مقادیر یک شیء را استخراج کند.
// Iterate through the keys Object.keys(employees).forEach(key => { let value = employees[key]; console.log(`${key}: ${value}`); });
خروجی
boss: Michael secretary: Pam sales: Jim accountant: Oscar
Object.keys برای بررسی طول یک شیء نیز مفید است.
// Get the length of the keys const length = Object.keys(employees).length; console.log(length);
خروجی
4
ما با استفاده از خصوصیت length میتوانیم 4 خصوصیت employees را بشماریم.
()Object.values
متد ()Object.values آرایهای ایجاد میکند که حاوی مقادیری برای یک شیء است.
// Initialize an object const session = { id: 1, time: `26-July-2018`, device: 'mobile', browser: 'Chrome' }; // Get all values of the object const values = Object.values(session); console.log(values);
خروجی
[1, "26-July-2018", "mobile", "Chrome"]
متدهای ()Object.values و ()Object.values امکان بازگشت دادهها از اشیا را فراهم میسازند.
()Object.entries
متد ()Object.entries یک آرایه تودرتو از جفتهای کلید/مقدار یک شیء ایجاد میکند.
// Initialize an object const operatingSystem = { name: 'Ubuntu', version: 18.04, license: 'Open Source' }; // Get the object key/value pairs const entries = Object.entries(operatingSystem); console.log(entries);
خروجی
[ ["name", "Ubuntu"] ["version", 18.04] ["license", "Open Source"] ]
زمانی که آرایههایی از جفت کلید/مقدار داشته باشیم، میتوانیم از متد ()forEach برای تعریف حلقهای روی آن استفاده کرده و نتایج مورد نظر خودمان را استخراج کنیم.
// Loop through the results entries.forEach(entry => { let key = entry[0]; let value = entry[1]; console.log(`${key}: ${value}`); });
خروجی
name: Ubuntu version: 18.04 license: Open Source
متد ()Object.entries تنها خصوصیات خود وهله شیء را باز میگرداند و نه خصوصیاتی که ممکن است از پروتوتایپش به ارث برده باشد.
()Object.assign
متد ()Object.assign برای کپی کردن مقادیر از یک شیء به شیء دیگر استفاده میشود. ما میتوانیم دو شیء ایجاد کرده و آنها را با استفاده از متد ()Object.assign ادغام کنیم.
// Initialize an object const name = { firstName: 'Philip', lastName: 'Fry' }; // Initialize another object const details = { job: 'Delivery Boy', employer: 'Planet Express' }; // Merge the objects const character = Object.assign(name, details); console.log(character);
خروجی
{firstName: "Philip", lastName: "Fry", job: "Delivery Boy", employer: "Planet Express"}
همچنین این امکان وجود دارد که از عملگر اسپرد (...) برای اجرای این وظیفه استفاده کرد. در کد زیر ما روش اعلان character را از طریق ادغام شیءهای name و details تغییر دادهایم.
// Initialize an object const name = { firstName: 'Philip', lastName: 'Fry' }; // Initialize another object const details = { job: 'Delivery Boy', employer: 'Planet Express' }; // Merge the object with the spread operator const character = {...name, ...details} console.log(character);
خروجی
{firstName: "Philip", lastName: "Fry", job: "Delivery Boy", employer: "Planet Express"}
ساختار اسپرد در ادبیات واژگان مربوط به اشیا به نام کلون کردن سطحی نیز نامیده میشود.
()Object.freeze
متد ()Object.freeze از تغییر یافتن خصوصیات و مقادیر یک شیء جلوگیری میکند و امکان افزودن یا حذف شدن خصوصیات از شیء سلب میشود.
// Initialize an object const user = { username: 'AzureDiamond', password: 'hunter2' }; // Freeze the object const newUser = Object.freeze(user); newUser.password = '*******'; newUser.active = true; console.log(newUser);
خروجی
{username: "AzureDiamond", password: "hunter2"}
در مثال فوق تلاش کردیم تا رمز عبور hunter2 را با ****** جایگزین کنیم؛ اما خصوصیت password بدون تغییری باقی ماند. همچنین تلاش کردیم تا یک خصوصیات جدید به نام active اضافه کنیم که آن نیز اضافه نشد.
متد ()Object.isFrozen نیز برای بررسی این که یک شیء قفل شده است یا نه در دسترس است و پاسخ را به صورت یک مقدار بولی باز میگرداند.
()Object.seal
متد ()Object.seal از اضافه شدن خصوصیتی به شیء جلوگیری میکند،؛ اما امکان تغییر خصوصیات موجود را ارائه میکند. این متد مشابه ()Object.freeze است. پیش از پیادهسازی کد زیر، کنسول خود را رفرش کنید تا از بروز خطا جلوگیری شود.
// Initialize an object const user = { username: 'AzureDiamond', password: 'hunter2' }; // Seal the object const newUser = Object.seal(user); newUser.password = '*******'; newUser.active = true; console.log(newUser);
خروجی
{username: "AzureDiamond", password: "*******"}
خصوصیت active جدید به شیء انتخابی افزوده نشده است؛ اما خصوصیت password با موفقیت تغییر یافته است.
()Object.getPrototypeOf
متد ()Object.getPrototypeOf برای دریافت خصوصیت [[Prototype]] که درون شیء به صورت داخلی پنهان شده است استفاده میشود. این خصوصیت از طریق خصوصیت __proto__ نیز در دسترس است.
در این مثال میتوانیم یک آرایه ایجاد کنیم که به پروتوتایپ Array دسترسی داشته باشد.
const employees = ['Ron', 'April', 'Andy', 'Leslie']; Object.getPrototypeOf(employees);
خروجی
[constructor: ƒ, concat: ƒ, find: ƒ, findIndex: ƒ, pop: ƒ, …]
در خروجی فوق میبینیم که پروتوتایپ آرایه employees به pop، find و دیگر متدهای پروتوتایپ آرایه دسترسی دارد. میتوانیم این مسئله را با تست کردن پروتوتایپ employees با Array.prototype تأیید کنیم.
Object.getPrototypeOf(employees) === Array.prototype;
خروجی
True
این متد برای دریافت اطلاعات بیشتر در مورد یک شیء یا تضمین این که به پروتوتایپ شیء دیگر دسترسی دارد مفید است.
یک متد دیگر نیز به نام ()Object.setPrototypeOf در این رابطه وجود دارد که یک پروتوتایپ به شیء دیگر اضافه میکند. توصیه شده است که از ()Object.create به جای این متد استفاده کنیم، زیرا سریعتر است و کارایی بیشتری دارد.
نتیجهگیری
اشیا متدهای مفیدی دارند که به ما کمک میکند تا آنها را اصلاح کرده، محافظت کنیم یا حلقهای روی آنها تعریف کنیم. در این راهنما شیوه ایجاد و انتساب اشیای جدید، تعریف حلقه روی کلیدها و/یا مقادیر یک شیء را بررسی کردیم و یک شیء را فریز یا مهروموم کردیم.
اگر این نوشته مورد توجه شما واقع شده، پیشنهاد میکنیم موارد زیر را نیز بررسی کنید:
- آموزش شی گرایی در طراحی و پیاده سازی زبان های برنامه سازی
- مجموعه آموزشهای برنامهنویسی
- جاوا اسکریپت و توسعه وب — راهنمای استفاده از مدل شیء سند (DOM)
- آموزش جاوا اسکریپت (JavaScript)
- برنامهنویسی شیءگرا چیست؟ — یک توضیح مقدماتی به زبان ساده
- کتابخانه و فریمورک جاوا اسکریپت که باید آنها را بشناسید
- طراحی و برنامه نویسی وب
- مفهوم کلاس در برنامه نویسی — همراه با نمونه مثال عملی
==
درود بر شما، آقای لطفی مطالب رو دقیق و خوب ارائه میکنید .