Middle
Πώς μπορεί να απαγορευτεί η αλλαγή ενός αντικειμένου σε JavaScript;
sobes.tech AI
Απάντηση από AI
Μπορείτε να χρησιμοποιήσετε τις ενσωματωμένες μεθόδους του Object:
Object.preventExtensions(obj): Αποτρέπει την προσθήκη νέων ιδιοτήτων στο αντικείμενο, αλλά επιτρέπει την τροποποίηση και διαγραφή των υφιστάμενων.Object.seal(obj): Αποτρέπει την προσθήκη και διαγραφή ιδιοτήτων, αλλά επιτρέπει την τροποποίηση των υφιστάμενων. Στην ουσία, αυτό είναιpreventExtensions+ απαγόρευση διαγραφής.Object.freeze(obj): Αποτρέπει την προσθήκη, διαγραφή και τροποποίηση ιδιοτήτων. Κάνει το αντικείμενο αμετάβλητο σε βάθος. Αυτό είναιseal+ απαγόρευση τροποποίησης υφιστάμενων ιδιοτήτων.
Παράδειγμα χρήσης:
// Αρχικό αντικείμενο
let myObject = { name: 'Alice', age: 30 };
// preventExtensions
Object.preventExtensions(myObject);
myObject.city = 'London'; // Δεν θα λειτουργήσει σε αυστηρό mode, θα αγνοηθεί σε μη αυστηρό.
// seal
let mySealedObject = { name: 'Bob', age: 25 };
Object.seal(mySealedObject);
mySealedObject.age = 26; // Θα λειτουργήσει
delete mySealedObject.name; // Δεν θα λειτουργήσει σε αυστηρό mode.
mySealedObject.city = 'Paris'; // Δεν θα λειτουργήσει σε αυστηρό mode.
// freeze
let myFrozenObject = { name: 'Charlie', age: 35 };
Object.freeze(myFrozenObject);
myFrozenObject.age = 36; // Δεν θα λειτουργήσει σε αυστηρό mode.
delete myFrozenObject.name; // Δεν θα λειτουργήσει σε αυστηρό mode.
myFrozenObject.city = 'New York'; // Δεν θα λειτουργήσει σε αυστηρό mode.
Είναι σημαντικό να θυμάστε ότι το Object.freeze είναι επιφανειακό. Αν το αντικείμενο περιέχει αναφορές σε άλλα αντικείμενα, αυτά τα εσωτερικά αντικείμενα μπορούν να τροποποιηθούν αν δεν είναι και αυτά παγωμένα. Για βαθύ πάγωμα, απαιτείται μια αναδρομική συνάρτηση.
// Παράδειγμα βαθύ πάγωματος
function deepFreeze(obj) {
Object.freeze(obj); // Παγώνει το τρέχον αντικείμενο
for (const key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
const prop = obj[key];
// Αν η ιδιότητα είναι αντικείμενο (και όχι null), το παγώνει αναδρομικά
if (typeof prop === 'object' && prop !== null && !Object.isFrozen(prop)) {
deepFreeze(prop);
}
}
}
}
let nestedObject = {
name: 'Deep',
details: {
level: 1
}
};
deepFreeze(nestedObject);
nestedObject.details.level = 2; // Δεν θα λειτουργήσει σε αυστηρό mode.
Πίνακας σύγκρισης:
| Μέθοδος | Προσθήκη ιδιοτήτων | Διαγραφή ιδιοτήτων | Τροποποίηση ιδιοτήτων |
|---|---|---|---|
Object.preventExtensions() |
Όχι | Ναι | Ναι |
Object.seal() |
Όχι | Όχι | Ναι |
Object.freeze() |
Όχι | Όχι | Όχι |