كما عرفنا من فصل أنواع البيانات، هنالك ثماني أنواع للبيانات في جافا سكريبت. سبعة منهم يسمون “أولية primitive”، لأن قيمهم تحتوي شيئا واحداً (لتكن سلسلة نصية أو رقم أو أي شيْء).
في المقابل، تستخدم الكائنات لحفظ مجموعات keyed collections من مختلف البيانات والكيانات المركبة.في جافا سكريبت، تدخل الكائنات تقريبا في كل جانب من جوانب اللغة. لذا يتوجب علينا فهمها قبل التعمق في أي شيء آخر.
يمكن إنشاء أي كائن باستخدام الأقواس المعقوفة {…} مع قائمة اختيارية بالخاصيات. الخاصية هي زوج من “مفتاح: قيمة” ( value) إذ يكون المفتاح عبارة عن نص (يُدعى “اسم الخاصية”)، والقيمة يمكن أن تكون أي شيء.
يمكننا تخيل الكائن كخزانة تحوي ملفات. يُخزن كل جزء من هذه البيانات في الملف الخاص به باستخدام المفتاح. يمكن إيجاد، أو إضافة، أو حذف ملف باستخدام اسمه.
يمكن إنشاء كائن فارغ (“خزانة فارغة”) باستخدام إحدى تركيبتين:
let user = new Object(); // "object constructor" syntax صيغة منشئ الكائن
let user = {}; // "object literal" syntax
تُستخدم الأقواس المعقوفة {...} عادة، وهذا النوع من التصريح يُسمى «الصياغة المختصرة لتعريف كائن» (object literal).
القيم المُجرَّدة والخاصيات
يمكننا إضافة بعض الخاصيات (properties) إلى الكائن المعرَّف بالأقواس {...} مباشرة بشكل أزواج “مفتاح: قيمة”:
let user = { // an object كائن
name: "John", // خزن القيمة "John" عبر المفتاح "name"
age: 30 // خزن القيمة "30" عبر المفتاح "age"
};
لدى كل خاصية مفتاح (يُدعى أيضًا "اسم " أو “مُعَرِّف”) قبل النقطتين ":" وقيمة لهذه الخاصية بعد النقطتين.
يوجد خاصيتين في الكائن user:
- اسم الخاصية الأولى هو
"name"وقيمتها هي"John". - اسم الخاصية الثانية هو
"age"وقيمتها هي"30".
يمكن تخيل الكائن السابق user كخزانة بملفين مُسَمَّيان “name” و “age”.
يمكننا إضافة، وحذف، وقراءة الملفات من الخزانة في أي وقت.
يمكن الوصول إلى قيم الخاصيات باستخدام الصيغة النُقَطية (dot notation):
//الحصول على قيم خصائص الكائن:
alert( user.name ); // John
alert( user.age ); // 30
يمكن للقيمة أن تكون من أي نوع، لِنُضِف قيمة من نوع بيانات منطقية (boolean):
user.isAdmin = true;
يمكننا استخدام المُعامِل delete لحذف خاصية:
delete user.age;
يمكننا أيضا استخدام خاصيات بأسماء تحوي أكثر من كلمة، لكن يجب وضعها بين علامات الاقتباس “”:
let user = {
name: "John",
age: 30,
"likes birds": true // يجب أن تكون الخاصية ذات الاسم المُحتوي على أكثر من كلمة بين علامتي اقتباس
};
يمكن إضافة فاصلة بعد آخر خاصية في القائمة:
let user = {
name: "John",
age: 30,
}
وهذا يسمى فاصلة “زائدة” أو “معلقة”. يجعل من السهل إضافة، إزالة، ونقل الخصائص، لأن جميع الأسطر تصبح متشابهة.
ملاحظة: يمكن تعديل كائن معلن على أنه ثابت.
مثلاً:
const user = {
name: "John"
};
user.name = "Pete"; // (*)
alert(user.name); // Pete
قد يبدو أن الخط (*) سيسبب خطأ، لكن ذلك لن يحدث. يُحدِّد “const” قيمة “user”، وليس إصلاح محتوياتها.
لن يُظهر “const” خطأ إلا إذا حاولنا تعيين "user = …` كله.
هناك طريقة أخرى لخلق خصائص كائن ثابتة، وسنتناولها لاحقًا في الفصل رايات الخصائص و واصفاتها.
الأقواس المربعة
لا تعمل طريقة الوصول إلى الخاصيات ذات الأسماء المحتوية على أكثر من كلمة باستخدام الصيغة النُقَطية:
// سيعطي هذا خطأ في الصياغة
user.likes birds = true
لا تفهم جافا سكريبت هذه الصيغه. يعتقد أننا نتعامل مع “user.likes”، ثم تعطي خطأ في بناء الجملة عندما يصادف “birds” غير متوقعة.
تتطلب النقطة أن يكون المفتاح معرفًا متغيرًا صالحًا. هذا يعني: أنه لا يحتوي على مسافات، ولا يبدأ برقم ولا يتضمن أحرفًا خاصة (يُسمح بـ $ و_).
هناك بديل “رمز القوس المربع” الذي يعمل مع أي سلسلة:
let user = {};
// تعيين قيمة
user["likes birds"] = true;
// الحصول على قيمة
alert(user["likes birds"]); // true
// حذف
delete user["likes birds"];
الآن كل شيء على ما يرام. يرجى ملاحظة أن السلسلة داخل الأقواس مقتبسة بشكل صحيح (أي نوع من علامات الاقتباس ستفعل).
توفر الأقواس المربعة أيضًا جلب اسم خاصية ناتجة عن قيمة أي تعبير -على عكس السلسلة الحرفية- مثل المتغير كما يلي:
let key = "likes birds";
// يشبه تماماً user["likes birds"] = true;
user[key] = true;
هنا, المتغير key يمكن حسابه وقت التنفيذ (run-time) أو اعتمادا على ما يدخله المستخدم. من ثم نستخدمها للوصول إلى الخاصية. وهذا يمنحنا قدراً كبيراً من المرونة.
مثلاً:
let user = {
name: "John",
age: 30
};
let key = prompt("What do you want to know about the user?", "name");
// الوصول عن طريق المتغير
alert( user[key] ); // John (if enter "name")
لا يمكن استخدام رمز النقطة بطريقة مماثلة لما مضى:
let user = {
name: "John",
age: 30
};
let key = "name";
alert( user.key ) // undefined