الكائنات هي نوع بيانات منفصل بنفس الطريقة التي يستخدمها
primitive هي نوع بيانات، يضم أحد العناصر المهمة
الاختلاف: على عكس العناصر الأولية، تكون العناصر قابلة للتغيير. يمكن أن يحتوي الكائن على بيانات
مرتبطة بالمعرّفات، مثل المتغيّر، ولكنها تحتفظ ببيانات object
الكتابة بغض النظر عن البيانات التي تحتوي عليها.
بخلاف القيم الأولية، تعد جميع قيم JavaScript كائنات، على الرغم من أنه حتى تُظهر القيم الحرفية الأولية سلوكًا يشبه الكائن بسبب التوريث النموذجي، فإنه أن لغة JavaScript تتكون بشكل فعّال من كائنات.
الكائن الحرفي هو زوج من الأقواس المعقوفة المحيطة بصفر أو أكثر من قيمة المفتاح/القيمة أزواج تسمى "الخصائص"، الذي يمكن أن يحتوي على أي قيمة JavaScript.
{
"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"];