تقدّم الكائنات العمومية متغيراتَ ودوال يمكن استعمالها من أي مكان. هذه الكائنات مضمّنة في بنية اللغة أو البيئة مبدئيًا.
في المتصفّحات تُدعى بالنافذة window وفي Node.js تُدعى بالعموميات global وفي باقي البيئات تُدعى بأيّ اسم مناسب يراه مطوّروها.
أُضيف حديثًا الكائن globalThis إلى اللغة ليكون اسم قياسيًا للكائن العمومي على أن تدعمه كلّ البيئات. ولكن بعض المتصفّحات (وبالخصوص عدا Chromium Edge) لا تدعم هذا الكائن بعد، ولكن يمكنك «ترقيعه تعدّديًا» بسهولة تامة.
سنستعمل هنا window على فرضية بأنّ البيئة هي المتصفّح نفسه. لو كنت ستشغّل السكربت الذي تكتبه في بيئات أخرى فربما تستعمل globalThis بدل النافذة تلك.
يمكننا طبعًا الوصول إلى كافة خصائص الكائن العمومي مباشرةً:
alert("Hello"); // تتطابق تمامًا مع window.alert("Hello");
يمكنك في المتصفّحات التصريح عن الدوال العمومية والمتغيرات باستعمال var (وليس let/const !) لتصير خاصيات للكائن العمومي:
var gVar = 5; alert(window.gVar); // 5 (تصير خاصية من خاصيات الكائن العمومي)
ولكن أرجوك ألا تعتمد على هذا الأمر! هذا السلوك موجود للتوافقية لا غير. تستعمل السكربتات الحديثة «وحداتَ جافاسكربت» (نشرحها في وقت لاحق) حيث لا يحدث هكذا أمر.
لن يحدث هذا لو استعملنا let هنا:
let gLet = 5; alert(window.gLet); // غير معرّف (لا تصير خاصية للكائن العمومي)
لو كانت القيمة هامّة جدًا جدًا وأردت أن تدخل عليها من أيّ مكان عمومي فاكتبها على أنّها خاصية مباشرةً:
// نجعل من معلومات المستخدم الحالي عمومية لتصل إليها كلّ السكربتات window.currentUser = { name: "John" }; // وفي مكان آخر يريدها أحد alert(currentUser.name); // John // أو (لو كان هناك المتغير المحلي ذا الاسم «currentUser» // فنأخذها جهارةً من النافذة (وهذا آمن!) alert(window.currentUser.name); // John
نختم هنا بأنّ استعمال المتغيرات العمومية غير محبّذ بالمرة ويجب أن يكون عددها بأقل ما يمكن. يُعدّ مبدأ تصميم الشيفرات حين تأخذ الدالة المتغيرات «الداخلة» وتُعطينا «نواتج» معيّنة - يُعدّ هذا المبدأ أفضل وأقلّ عُرضة للأخطاء وأسهل للاختبار موازنةً بالمتغيرات الخارجية أو العمومية.
استعمالها للترقيع تعدديًا
المجال الذي نستعمل الكائنات العمومية فيه هو اختبار لو كانت البيئة تدعم مزايا اللغة الحديثة.
فمثلًا يمكننا اختبار لو كانت كائنات الوعود Promise المضمّنة في اللغة مضمّنة حقًا (لم تكن كذلك في المتصفحات العتيقة):
if (!window.Promise) { alert("Your browser is really old!"); // تستعمل يا صاح متصفّحا من زمن الطيبين! }
لو لم نجد هذه الكائنات (مثلًا نستعمل متصفّحًا قديمًا) فيمكننا «ترقيعه تعدّديًا»: أي إضافة الدوال التي لا تدعمها البيئة بينما هي موجودة في معيار اللغة الحديث.
if (!window.Promise) { window.Promise = ... // شيفرة نكتبها بنفسنا تؤدّي الميزة الحديثة في اللغة هذه }
ملخص
-
يحمل الكائن العمومي تلك المتغيرات التي يلزم أن نصل إليها أينما كنّا في الشيفرة.
تشمل المتغيرات هذه كل ما هو مضمّن في بنية لغة جافاسكربت مثل المصفوفات
Arrayوالقيم المخصّصة للبيئة مثلwindow.innerHeight(ارتفاع نافذة المتصفّح). -
للكائن العمومي اسم عام في المواصفة:
globalThis.ولكن… دومًا ما نُشير إليه بالأسماء «الأثرية» حسب كل بيئة مثل
window(في المتصفحات) وglobal(في Node.js)، إذ أنّglobalThisهو مُقترح جديد على اللغة وليس مدعومًا في المتصفّحات عدة Chromium Edge (ولكن يمكننا ترقيعه تعدّديًا). -
علينا ألا نخزّن القيم في الكائن العمومي إلّا لو كانت حقًا وفعلًا عمومية للمشروع الذي نعمل عليه. كما ويجب أن يبقى عددها بأقل ما يمكن.
-
حين نطوّر لاستعمال الشيفرات في المتصفّحات (لو لم نستعمل الوحدات)، تصير الدوال العمومية والمتغيرات باستعمال
varخاصيات للكائن العمومي. علينا استعمال خاصيات الكائن العمومي مباشرةً (مثلwindow.x) لتكون الشيفرة سهلة الصيانة مستقبلًا وأسهل فهمًا.
ترجمة -وبتصرف- للفصل Global object من كتاب The JavaScript language

أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.