متدهای آبجکت
کالا اسم و قیمت دارد، ولی هنوز یک کارِ مالِ خودِ کالا کم است: برچسب را بسازد، تعداد سبد را بالا ببرد، به خریدار سلام کند. آن کار را تابعی انجام میدهد که روی خودِ آبجکت نشسته. اسم این تابع، متد است.
بعد از کلید و فهرست
درس ویژگیها فیلد را آورد، یکی را برداشت، با in پرسید، داخل آبجکت تو در تو رفت و با Object.keys نامها را گرفت. آنجا تابعی اجرا نشد. اینجا مقدارِ یک ویژگی خودش تابع است و از روی همان آبجکت صدا زده میشود.
پنج حرکت با متد
📊 ذخیره، صدا زدن، کوتاهنویسی، this، آرگومان
| حرکت | نحو | چه به دست میآید |
|---|---|---|
| ذخیره | greet: function () { return "Hi"; } |
تابعی که روی آبجکت نشسته |
| صدا زدن | product.greet() |
تابع اجرا میشود و نتیجهاش را میگیرید |
| کوتاهنویسی | label() { return this.name; } |
همان جنس تابع، با املای کوتاهتر |
| this | this.name داخل متد |
آبجکتی که قبل از نقطه بود |
| آرگومان | cart.add(3) |
ورودی اضافه فقط برای همین صدا زدن |
اول اسم حرکت را انتخاب کنید، بعد خط را بنویسید. ذخیره کردن، تابع را اجرا نمیکند. کوتاهنویسی نوع تازهای از مقدار نیست. this اسم سراسری کالا نیست که امیدوار باشید جایی وجود دارد. آرگومان ورودیِ همین فراخوانی است، نه آبجکت دوم.
let product = {
name: "Mug",
greet: function () {
return "Hi";
}
};
console.log(typeof product.greet);
مقدار میتواند تابع باشد
name رشته نگه میدارد. greet تابع نگه میدارد. حاصل typeof product.greet برابر "function" است. هنوز چیزی اجرا نشده، پس Hi را نمیبینید. اسم لیوان کنار همان تابع سر جایش است.
let product = {
name: "Mug",
greet: function () {
return "Hi";
}
};
console.log(product.greet());
پرانتز دکمهٔ اجراست
product.greet() وارد تابع میشود. کنسول Hi را چاپ میکند. پرانتز را بردارید و به خودِ تابع نگاه میکنید، نه به چیزی که برمیگرداند. نقطه میگوید این صدا زدن مال کدام آبجکت است.
let product = {
name: "Mug",
label() {
return this.name;
}
};
console.log(product.label());
کوتاهنویسی فقط املای جمعوجورتر است
داخل آکولاد، label() { ... } تابع را روی کلید label میگذارد. جنسش با greet: function () { ... } یکی است؛ فقط تایپ کمتر میخواهد. product.label() اجراش میکند. بدنه this.name را میخواند و کنسول Mug را نشان میدهد.
let product = {
name: "Mug",
price: 8,
tag() {
return this.name + " — " + this.price;
}
};
console.log(product.tag());
در فراخوانی ساده، this همان آبجکتِ قبل از نقطه است
معنی product.tag() این است: tag را اجرا کن و بگذار this همان product باشد. آنوقت this.name و this.price فیلدهای خودِ لیواناند. کنسول Mug — 8 را چاپ میکند. name برهنه داخل متد جستوجوی دیگری است و خودِ ویژگی نیست. اگر شکل صدا زدن دیگر object.method() نباشد، this ممکن است جای دیگری برود — آن درس بعدی است. این صفحه فقط فراخوانی ساده را نگه میدارد.
let cart = {
count: 2,
add(extra) {
this.count = this.count + extra;
return this.count;
}
};
console.log(cart.add(3));
متد برای همین صدا زدن ورودی میگیرد
add منتظر extra است. cart.add(3) عدد 3 را میدهد، به count اضافه میکند و جمع تازه را برمیگرداند. کنسول 5 را چاپ میکند. سبد همان count بهروز را نگه میدارد. آرگومان مالِ همین فراخوانی است و فقط اگر خودتان ذخیرهاش کنید ویژگی میشود.
حرکتی را بردارید که به کار میآید
تابع باید روی آبجکت زندگی کند؟ ذخیرهاش کنید، شکل بلند یا کوتاه. نتیجه را میخواهید؟ با () صدا بزنید. فیلدهای خودِ آبجکت را میخواهید؟ از راه this بخوانید. عددی فقط برای همین اجرا لازم است؟ آرگومان بدهید. Object.keys در درس قبل نامها را فهرست کرد. درس بعد کنار this میماند، وقتی شکل صدا زدن عوض شود.
برچسب متد را روی صفحه بگذارید
برای کالا name و price و tag بگذارید. حاصل product.tag() را داخل یک پاراگراف بنویسید.
<!DOCTYPE html>
<html>
<head>
<title>object-methods — page</title>
</head>
<body>
<p id="line">…</p>
<script>
let product = {
name: "Mug",
price: 8,
tag() {
return this.name + " — " + this.price;
}
};
let box = document.getElementById("line");
box.textContent = product.tag();
</script>
</body>
</html>
پاراگراف Mug — 8 را نشان میدهد. tag این رشته را از فیلدهای خودِ کالا ساخته. فقط name یا price را عوض کنید، تازه کنید، و خط جدید را بخوانید. درس بعد: کلمهٔ this — وقتی صدا زدن دیگر به شکل سادهٔ object.method() نیست، this به کجا اشاره میکند.
گامهای تمرین
- تابعی را روی
greetبگذارید وtypeofهمان ویژگی را چاپ کنید. product.greet()را صدا بزنید وHiرا بخوانید.labelرا با کوتاهنویسی بنویسید وproduct.label()را چاپ کنید.tagرا طوری بسازید کهthis.nameوthis.priceیک رشته شوند.countرا از ۲ شروع کنید،add(3)را صدا بزنید و5را بخوانید.- در دموی HTML فقط
nameیاpriceرا عوض کنید، تازه کنید، پاراگراف را بخوانید.
لغزشهای پرتکرار
product.greetرا بدون()چاپ کنید و منتظرHiبمانید- کوتاهنویسی
label() {}را ویژگیِ رشتهای حساب کنید - داخل متد بهجای
this.nameفقطnameبرهنه بنویسید - خیال کنید
cart.add(3)مقدارcountرا روی ۲ نگه میدارد - وقتی میخواستید متد را صدا بزنید سراغ
Object.keysبروید - تابع پیکانی را جای متد این صفحه بگذارید — درس بعد
thisرا وقتی شکل صدا زدن عوض میشود دنبال میکند
جمعبندی
- متد تابعی است که بهصورت ویژگی ذخیره شده
object.method()اجراش میکند و مقدار برگشتی را میدهد- کوتاهنویسی
name() {}همان جنس تابع را ذخیره میکند - در فراخوانی ساده،
thisآبجکتِ قبل از نقطه است - پارامتر، آرگومانِ همان صدا زدن را میگیرد
- رشتهٔ متد میتواند یک خط از صفحه را پر کند
- بعدی: کلمهٔ
this، وقتی صدا زدنobject.method()نیست
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود