Πώς να κάνετε μια ιδιότητα αντικειμένου αμετάβλητη;
sobes.tech AI
Απάντηση από AI
Πώς να κάνετε μια ιδιότητα αντικειμένου αμετάβλητη μπορεί να γίνει με διάφορους τρόπους:
-
Χρήση
Object.defineProperty():Αυτή η μέθοδος επιτρέπει τον ορισμό ή την τροποποίηση ιδιοτήτων ενός αντικειμένου με πιο λεπτομερή έλεγχο. Για να δημιουργήσετε μια αμετάβλητη ιδιότητα, πρέπει να ορίσετε τον περιγραφέα της ιδιότητας με
writable: false.const obj = {}; Object.defineProperty(obj, 'myProperty', { value: 'Αμετάβλητη τιμή', writable: false, // Κάνει την ιδιότητα αμετάβλητη enumerable: true, // Η ιδιότητα θα εμφανίζεται κατά την επανάληψη configurable: true // Η ιδιότητα μπορεί να διαγραφεί ή να τροποποιηθεί }); // Η προσπάθεια αλλαγής της τιμής θα αγνοηθεί σε μη αυστηρή λειτουργία // και θα προκαλέσει σφάλμα TypeError σε αυστηρή λειτουργία obj.myProperty = 'Νέα τιμή'; console.log(obj.myProperty); // Θα εμφανίσει "Αμετάβλητη τιμή"Αν ορίσετε
configurable: false, η ιδιότητα δεν μπορεί να διαγραφεί ή να τροποποιηθεί (συμπεριλαμβανομένου τουwritable).const obj2 = {}; Object.defineProperty(obj2, 'myProperty', { value: 'Αμετάβλητη και δύσκολα διαγράψιμη', writable: false, enumerable: true, configurable: false // Κάνει τον περιγραφέα της ιδιότητας αμετάβλητο }); // Προσπάθεια αλλαγής της τιμής obj2.myProperty = 'Νέα τιμή'; console.log(obj2.myProperty); // Θα εμφανίσει "Αμετάβλητη και δύσκολα διαγράψιμη" // Προσπάθεια διαγραφής της ιδιότητας delete obj2.myProperty; console.log(obj2.myProperty); // Θα εμφανίσει "Αμετάβλητη και δύσκολα διαγράψιμη" -
Χρήση
Object.freeze():Αυτή η μέθοδος κάνει το αντικείμενο "καταψυγμένο". Αυτό σημαίνει ότι δεν μπορείτε να προσθέσετε νέες ιδιότητες, να διαγράψετε υπάρχουσες, να αλλάξετε τις τιμές των υφιστάμενων ιδιοτήτων (συμπεριλαμβανομένης της enumerability και της διαμόρφωσης), καθώς και να αλλάξετε το πρωτότυπο του αντικειμένου.
const obj = { myProperty: 'Αμετάβλητη τιμή' }; Object.freeze(obj); // Προσπάθεια αλλαγής της τιμής obj.myProperty = 'Νέα τιμή'; console.log(obj.myProperty); // Θα εμφανίσει "Αμετάβλητη τιμή" // Προσπάθεια προσθήκης νέας ιδιότητας obj.newProperty = 'Νέο'; console.log(obj.newProperty); // undefined // Προσπάθεια διαγραφής της ιδιότητας delete obj.myProperty; console.log(obj.myProperty); // "Αμετάβλητη τιμή"Είναι σημαντικό να σημειωθεί ότι το
Object.freeze()είναι επιφανειακό. Αν μια ιδιότητα του αντικειμένου είναι άλλο αντικείμενο, αυτό το εσωτερικό αντικείμενο δεν θα παγώσει. -
Χρήση
constγια μεταβλητές που περιέχουν αντικείμενο:Η λέξη-κλειδί
constκάνει τη σύνδεση με το αντικείμενο αμετάβλητη, αλλά όχι το ίδιο το αντικείμενο. Δεν μπορείτε να ανακατευθύνετε τη μεταβλητή σε ένα άλλο αντικείμενο, αλλά μπορείτε να αλλάξετε τις ιδιότητες του αντικειμένου.const obj = { myProperty: 'Αρχική τιμή' }; // Μπορείτε να αλλάξετε την τιμή της ιδιότητας obj.myProperty = 'Νέα τιμή'; console.log(obj.myProperty); // "Νέα τιμή" // Δεν μπορείτε να ανακατευθύνετε τη μεταβλητή // obj = { άλληΙδιότητα: 'Άλλο' }; // Θα προκαλέσει TypeError
Σύγκριση μεθόδων:
| Μέθοδος | Τι κάνει αμετάβλητο; | Επίπεδο αμεταβλητότητας |
|---|---|---|
Object.defineProperty() |
Μία συγκεκριμένη ιδιότητα | Ορίζεται από τον περιγραφέα |
Object.freeze() |
Ολόκληρο το αντικείμενο | Επιφανειακό |
const |
Αναφορά στο αντικείμενο | Μεταβλητή |
Η επιλογή της μεθόδου εξαρτάται από το πόσο λεπτομερής πρέπει να είναι η αμεταβλητότητα. Για μια ιδιότητα, ταιριάζει το Object.defineProperty(), για ολόκληρο το αντικείμενο - Object.freeze(). Για αποτροπή ανακατεύθυνσης της αναφοράς, χρησιμοποιείται το const.