قابلية التغيير هي القدرة على تغيير القيمة. يمكن تغيير القيمة القابلة للتغيير، ولا يمكن تغيير القيمة غير القابلة للتغيير. من المفاهيم الخاطئة الشائعة أن الكلمة الأساسية "const" تجعل المتغير غير قابل للتغيير.
في الواقع، يمنع "const" إعادة التعيين فقط. بالنسبة للأنواع غير الكائنية، لا يمكن تغيير القيم إلا عن طريق إعادة التعيين، لذا فإن الإعلان عنها باستخدام "const" يجعلها في الواقع غير قابلة للتغيير. خذ على سبيل المثال الكود التالي:
const num = 5; num = 7; // illegal reassignment of const variable
لا توجد طريقة لتغيير قيمة num في هذا الكود. لاحظ أن استخدام أو -- لا يزال يعتبر بمثابة عمليات إعادة تعيين، ويتم الإشارة إلى ذلك في رسالة الخطأ إذا حاولنا استخدامها على متغير تم الإعلان عنه باستخدام const.
const num = 5; num ;//illegal reassignment of constant
الخطأ الناتج هو:
Uncaught TypeError: Assignment to constant variable.
تختلف الكائنات اختلافًا جوهريًا فيما يتعلق بقابلية التغيير حيث يمكن أن تتغير قيمها دون إعادة تعيين المتغير. لاحظ أن إعادة تعيين الخصائص لا يمنعها "const". اسم المتغير فقط هو الذي يمنع من إعادة التعيين.
const obj = {num: 5}; obj.num = 7; //legal obj = {num: 7}; //illegal reassignment
يمكن أن تحتوي الكائنات أيضًا على طرق تغير القيم الداخلية.
const obj = { num: 5, increment(){ this.num ; } } obj.increment(); console.log(obj.num); //6
من الممكن جعل الكائن غير قابل للتغيير فعليًا من خلال الإعلان عنه باستخدام "const" واستخدام Object.freeze().
const obj = {num: 5}; Object.freeze(obj); obj.num = 7; // doesn't change console.log(obj.num);// still 5
لاحظ أنه إذا استخدمنا الوضع الصارم، فإن محاولة تغيير القيمة العددية ستتسبب في حدوث عطل مع ظهور رسالة الخطأ التالية:
Cannot assign to read only property 'num'
إن استخدام Object.freeze() بدون "const" كافٍ بالفعل لجعل هذا الكائن غير قابل للتغيير. ومع ذلك، فإنه لا يجعل اسم المتغير غير قابل للتغيير.
let obj = {num: 5}; Object.freeze(obj); obj = {num: 5}; // new object with old name obj.num = 7; // changes successfully console.log(obj.num);// 7
ما يحدث في هذا الإصدار من الكود هو أنه تتم إعادة تعيين obj. تم تطبيق التجميد () على الكائن السابق الذي يحمل نفس الاسم، لكن الكائن الجديد لم يتم تجميده مطلقًا، لذا فهو قابل للتغيير.
هناك أوقات قد ترغب فيها في السماح بتغيير القيم الموجودة في كائن ما، ولكنك لا تريد السماح بإضافة خصائص أو إزالتها. ويمكن تحقيق ذلك باستخدام Object.seal().
let obj = {num: 5}; Object.seal(obj); obj.num = 7; // changes console.log(obj.num);// 7 obj.newValue = 42; //cannot add new property to sealed object console.log(obj.newValue);//undefined delete obj.num; //cannot delete property from sealed object console.log(obj.num);// still exists and is 7
ينطبق التجميد والختم على الكائن بأكمله. إذا كنت تريد جعل خصائص معينة غير قابلة للتغيير، فيمكن القيام بذلك باستخدام DefineProperty() أو DefinProperties(). يعتمد الاختيار بين هذين الأمرين على ما إذا كنت تريد التأثير على خاصية واحدة أو خصائص متعددة.
const obj = {}; Object.defineProperty(obj, 'num',{ value: 5, writable: false, configurable: false }); obj.num = 7; // Cannot change value because writable is false delete obj.num; // Cannot delete because configurable is false console.log(obj.num);//Still exists and is 5
يتم تعريف خاصية جديدة في هذا المثال، ولكن يمكن أيضًا استخدام DefineProperty() على خاصية موجودة. لاحظ أنه إذا تم تعيين "قابل للتكوين" مسبقًا على خطأ، فلا يمكن تغييره إلى صحيح، ولكن إذا كان صحيحًا في الأصل، فيمكن تعيينه على خطأ، نظرًا لأن هذا التغيير يعتبر نوعًا من التكوين.
في معظم الحالات، لن تحتاج إلى ضمان أن الكائن غير قابل للتغيير. عندما تنشأ مثل هذه الحاجة، يكون تجميد الكائن كافيًا عمومًا، ولكن لدينا خيارات إضافية لضوابط أكثر دقة إذا ظهرت مثل هذه الاحتياجات.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3