اشیاء

اشیاء یک نوع داده گسسته هستند به همان صورتی که هر اولیه یک نوع داده است، با یک تفاوت اساسی: بر خلاف اولیه، اشیا قابل تغییر هستند. یک شی می‌تواند حاوی داده‌های مرتبط با شناسه‌ها باشد، مانند یک متغیر، اما نوع داده object خود را بدون توجه به داده‌هایی که دارد حفظ می‌کند.

جدا از مقادیر اولیه، همه مقادیر جاوا اسکریپت اشیاء هستند، اگرچه از آنجایی که حتی کلمات بدوی نیز به دلیل وراثت نمونه اولیه رفتاری شبیه به شی نشان می دهند، اغلب گفته می شود که جاوا اسکریپت به طور موثر از اشیا تشکیل شده است.

شی لفظی یک جفت پرانتز فرفری است که جفت‌های صفر یا چند مقدار کلید به نام «ویژگی‌ها» را احاطه کرده‌اند که می‌توانند حاوی هر مقدار جاوا اسکریپت باشند.

{
    "myProperty" : true
}

کلیدهای ویژگی می توانند هر نماد یا رشته ای باشند. همانطور که هنگام تخصیص یک شناسه به یک متغیر، رشته های مورد استفاده به عنوان کلیدهای ویژگی باید قابل پیش بینی و توصیفی باشند:

let carAttributes = {
    "color" : "red"
};

carAttributes
> Object { color: "red" }

کلیدهای ویژگی به یک رشته تک ( ' ) یا دو نقل قولی ( " ) نیاز دارند، نه به معنای واقعی کلمه :

let carAttributes = {
    `keyString` : false
};
> Uncaught SyntaxError: expected property name, got template literal

مقادیر ویژگی می تواند هر نوع داده ای باشد. ویژگی های یک شی می تواند خود شامل اشیایی با ویژگی های خاص خود باشد:

let myObject = {
    'key' : {
        'subkey' : true,
        'othersubkey' : false
    }
};

myObject;
> Object { key: Object { subkey: true, othersubkey: false } }

هنگامی که مقدار یک ویژگی یک تابع باشد، آن ویژگی "روش" نامیده می شود.

const myObject = {
    "myProperty" : true,
    myMethod() {
        console.log( "This is a method." );
    }
}

myObject.myProperty;
> true

myObject.myMethod();
> "This is a method."

همچنین می توانید با استفاده از کلمه کلیدی new یک شی ایجاد کنید:

let myObject = new Object();

در مثال‌های قبلی، اشیاء جدید ایجاد شده به متغیرها اختصاص داده شده‌اند. این مورد نیاز نیست، زیرا مانند هر نوع داده دیگری، می توانید از یک شی بدون شناسه در هر جایی که یک شی مورد انتظار است استفاده کنید. با این حال، یک شیء تحت اللفظی به پرانتز در هر زمینه ای نیاز دارد که ممکن است برای یک دستور بلوک اشتباه گرفته شود، با توجه به اینکه این دو از نحو پرانتز فرفری ( {} ) مشترک هستند. مقداردهی اولیه یک متغیر هرگز به این نیاز ندارد.

{ "value" : 2 }
> Uncaught SyntaxError: unexpected token: ':'

({ "value" : 2 })
> Object { value: 2 }

let valObj = { "value" : 2 };

valObj;
> Object { value: 2 }

بر خلاف بدوی، هیچ تفاوت معنی‌داری در نتایج ایجاد یک شی با استفاده از new Object() و ایجاد یک شی به معنای واقعی کلمه وجود ندارد، زیرا نتیجه در هر صورت یک شی با ویژگی‌های به ارث رسیده از نمونه اولیه Object خواهد بود. با این حال، یک تفاوت عملی بین این دو نحو وجود دارد.

کلمه کلیدی new باید یک شی خالی را تعریف کند که بعداً با داده پر می شود:

let myObject = new Object();

myObject.booleanValue = true;
myObject.stringValue = "My string.";

یک شی لفظی می تواند با داده ها در هنگام ایجاد آن پر شود:

let myObject = {
    'booleanValue' : true,
    'stringValue' : "My string."
};

اگرچه کاربرد عملی کمی دارد، new Object() می‌تواند برای تبدیل مقادیر داده‌های اولیه به آبجکت‌هایی از نوع مربوطه استفاده شود، مانند مواردی که با استفاده از کلمه کلیدی new به همراه تابع سازنده آن‌ها برمی‌گردند. به عنوان مثال، موارد زیر از نظر عملکردی معادل new Number( 10 ) است:

let myObject = new Object( 10 );

myObject;
> Number { 10 }

مقادیر null و undefined منجر به یک شی خالی می شود که از نظر عملکردی با فراخوانی new Object() بدون ارائه آرگومان یکسان است.

ارسال یک شی به معنای واقعی کلمه به new Object() به عنوان آرگومان، شی را بدون تغییر به صورت لفظی ارسال می کند:

let myObject = new Object( { myValue : 10 } );

myObject;
> Object { myValue: 10 }

همانند استفاده از سازنده ها برای مقادیر اولیه، استفاده از سازنده ها برای اشیا به ندرت نسبت به استفاده از نماد تحت اللفظی اشیاء مزایایی دارد. حتی زمانی که اشیاء خالی ایجاد می‌کنند تا بعداً با مقادیر پر شوند، توسعه‌دهندگان تمایل دارند به خاطر سادگی، از نمادگذاری تحت اللفظی اشیاء استفاده کنند.

درک خود را بررسی کنید

از چه نوع نمادهایی می توانید برای تنظیم ویژگی های یک شی استفاده کنید؟

نشانه گذاری نقطه
نماد براکت
نماد دوره
نماد خط

کدام یک از دستورات زیر برای بدست آوردن مقدار myProp صحیح است

myObj["myProp"];
myObj{"myProp"};
myObj("myProp");