جافا سكريبت: الحقول العامة والخاصة

تقوم عدة اقتراحات بتوسيع بناء جملة الفئة الموجود في JavaScript مع وظائف جديدة. تشرح هذه المقالة بناء الجملة الجديد لحقول الطبقة العامة في V8 v7.2 و Chrome 72 ، بالإضافة إلى الحقول الخاصة القادمة.


فيما يلي مثال على التعليمة البرمجية التي تنشئ مثيلًا لـ GrowingCounter :


const counter = new IncreasingCounter(); counter.value; // logs 'Getting the current value!' // → 0 counter.increment(); counter.value; // logs 'Getting the current value!' // → 1 

لاحظ أن الوصول إلى القيمة ينفذ بعض التعليمات البرمجية (إخراج رسالة إلى السجل) قبل إرجاع القيمة. اسأل نفسك الآن: كيف يمكنك تطبيق هذه الفئة في JavaScript؟


فصول ES2015


يوجد أدناه مثال على كيفية تطبيق فئة GrowingCounter باستخدام بناء جملة ES2015:


 class IncreasingCounter { constructor() { this._count = 0; } get value() { console.log('Getting the current value!'); return this._count; } increment() { this._count++; } } 

يوفر الفصل قيمة getter وطريقة لزيادة قيمة في نموذج أولي. أكثر فضولاً ، أن لدى الفصل مُنشئ يقوم ببدء خاصية _count وتعيين قيمته الأولية إلى 0. الآن نستخدم بادئة تسطير أسفل السطر للإشارة إلى أنه لا ينبغي استخدام _count مباشرة خارج الفصل ، ولكن هذا مجرد اصطلاح ؛ في الواقع ، هذه ليست ملكية خاصة ، ولا يتم تعريف هذه الدلالات في اللغة نفسها.


 const counter = new IncreasingCounter(); counter.value; // logs 'Getting the current value!' // → 0 // Nothing stops people from reading or messing with the // `_count` instance property. counter._count; // → 0 counter._count = 42; counter.value; // logs 'Getting the current value!' // → 42 

الحقول العامة الصف


بناء الجملة الجديد للحقول العامة يبسط تعريف الفئة:


 class IncreasingCounter { _count = 0; get value() { console.log('Getting the current value!'); return this._count; } increment() { this._count++; } } 

يتم الآن تعريف خاصية _count بإيجاز في بداية الفصل الدراسي. لم نعد بحاجة إلى مُنشئ فقط لتحديد بعض الحقول. عظيم!


ومع ذلك ، لا يزال _count خاصية عامة. وفي هذا المثال المحدد ، نريد منع الوصول إلى هذا الحقل مباشرةً.


حقول الصف الخاص


هذا هو المكان الذي تأتي فيه الحقول الخاصة للإنقاذ. يشبه بناء الجملة الجديد للحقول الخاصة بناء جملة الحقول العامة ، إلا أنك تضع علامة عليها كخاصة باستخدام الرمز # . قد تعتقد أن # هو مجرد جزء من اسم الحقل:


 class IncreasingCounter { #count = 0; get value() { console.log('Getting the current value!'); return this.#count; } increment() { this.#count++; } } 

الحقول الخاصة غير متوفرة خارج نص الفصل الدراسي:


 const counter = new IncreasingCounter(); counter.#count; // → SyntaxError counter.#count = 42; // → SyntaxError 

خصائص ثابتة


يمكن استخدام بناء جملة حقل الفئة لإنشاء خصائص وطرق ثابتة عامة وخاصة ، كما هو موضح أدناه:


 class FakeMath { // `PI` is a static public property. static PI = 22 / 7; // Close enough. // `#totallyRandomNumber` is a static private property. static #totallyRandomNumber = 4; // `#computeRandomNumber` is a static private method. static #computeRandomNumber() { return FakeMath.#totallyRandomNumber; } // `random` is a static public method (ES2015 syntax) // that consumes `#computeRandomNumber`. static random() { console.log('I heard you like random numbers…') return FakeMath.#computeRandomNumber(); } } FakeMath.PI; // → 3.142857142857143 FakeMath.random(); // logs 'I heard you like random numbers…' // → 4 FakeMath.#totallyRandomNumber; // → SyntaxError FakeMath.#computeRandomNumber(); // → SyntaxError 

تبسيط العمل مع الفئات الفرعية


تصبح فوائد بناء جملة الحقل الجديد أكثر وضوحًا عند العمل مع الفئات الفرعية التي تقدم حقولًا إضافية. تخيل فئة قاعدة الحيوان التالية:


 class Animal { constructor(name) { this.name = name; } } 

لإنشاء فئة فرعية من Cat تضيف خاصية جديدة إلى المثيل ، كان يلزمك في السابق الاتصال بـ super () للاتصال بمنشئ الفئة الأساسية للحيوانات قبل إنشاء هذه الخاصية:


 class Cat extends Animal { constructor(name) { super(name); this.likesBaths = false; } meow() { console.log('Meow!'); } } 

يوجد الكثير من التعليمات البرمجية الخاصة بالإشارة إلى أن القطط لا تحب أن تأخذ حمامًا. لحسن الحظ ، فإن بناء جملة حقل الفئة الجديد يلغي الحاجة إلى تعريف هذا المُنشئ باستدعاء محرج إلى super () :


 class Cat extends Animal { likesBaths = false; meow() { console.log('Meow!'); } } 

المجموع


تتوفر حقول الطبقة العامة بدءًا من V8 v7.2 و Chrome 72. وهناك خطط لإطلاق حقول الصف الخاص قريبًا.

Source: https://habr.com/ru/post/ar438202/


All Articles