"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > قابلية الكائن للتغيير في جافا سكريبت

قابلية الكائن للتغيير في جافا سكريبت

تم النشر بتاريخ 2024-08-19
تصفح:864

Object Mutability in Javascript

قابلية الكائن للتغيير

قابلية التغيير هي القدرة على تغيير القيمة. يمكن تغيير القيمة القابلة للتغيير، ولا يمكن تغيير القيمة غير القابلة للتغيير. من المفاهيم الخاطئة الشائعة أن الكلمة الأساسية "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". اسم المتغير فقط هو الذي يمنع من إعادة التعيين.

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() على خاصية موجودة. لاحظ أنه إذا تم تعيين "قابل للتكوين" مسبقًا على خطأ، فلا يمكن تغييره إلى صحيح، ولكن إذا كان صحيحًا في الأصل، فيمكن تعيينه على خطأ، نظرًا لأن هذا التغيير يعتبر نوعًا من التكوين.

خاتمة

في معظم الحالات، لن تحتاج إلى ضمان أن الكائن غير قابل للتغيير. عندما تنشأ مثل هذه الحاجة، يكون تجميد الكائن كافيًا عمومًا، ولكن لدينا خيارات إضافية لضوابط أكثر دقة إذا ظهرت مثل هذه الاحتياجات.

بيان الافراج تم نشر هذه المقالة على: https://dev.to/chooking/object-mutability-in-javascript-1nk4?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3