Τι ξέρεις για τους περιγραφείς;
sobes.tech AI
Απάντηση από AI
Οι περιγραφείς στο JavaScript είναι αντικείμενα που περιγράφουν διάφορες ιδιότητες ενός αντικειμένου, όπως η τιμή του (value), η δυνατότητα εγγραφής (writable), η δυνατότητα επανάληψης (enumerable) και η δυνατότητα διαμόρφωσης (configurable). Υπάρχουν επίσης περιγραφείς με getters και setters.
Υπάρχουν δύο τύποι περιγραφέων:
-
Περιγραφείς δεδομένων: Περιέχουν την τιμή της ιδιότητας.
value: Η τιμή της ιδιότητας. Μπορεί να είναι οποιοδήποτε έγκυρο τύπο δεδομένων.writable: Λογική τιμή. Αν είναιtrue, η τιμή της ιδιότητας μπορεί να αλλάξει (obj.prop = newValue). Προεπιλογήfalseγια accessor καιtrueγια δεδομένα που δημιουργούνται με απλή ανάθεση.enumerable: Λογική τιμή. Αν είναιtrue, η ιδιότητα θα εμφανίζεται κατά την επανάληψη των ιδιοτήτων του αντικειμένου (π.χ. σεfor...inή μεObject.keys()). Προεπιλογήfalseγια ιδιότητες που προστίθενται μεObject.defineProperty, καιtrueγια αυτές που δημιουργούνται με απλή ανάθεση.configurable: Λογική τιμή. Αν είναιtrue, τα χαρακτηριστικά του περιγραφέα (εκτός από τοvalueκαι τοwritableόταν αλλάζουν από δεδομένα σε accessor) μπορούν να αλλάξουν και η ιδιότητα μπορεί να διαγραφεί. Προεπιλογήfalseγια ιδιότητες που προστίθενται μεObject.defineProperty(εκτός από τοvalue), καιtrueγια αυτές που δημιουργούνται με απλή ανάθεση. Μόλις οριστεί ως μη διαμορφώσιμη, δεν μπορεί να αλλάξει πίσω. Μπορείτε να μειώσετε τοwritableαπόtrueσεfalse, αλλά όχι το αντίθετο σε μη διαμορφωμένο getter/setter.
-
Περιγραφείς accessor: Ορίζουν λειτουργίες που καλούνται κατά την ανάγνωση (getter) ή την εγγραφή (setter) της ιδιότητας.
get: Συνάρτηση που καλείται κατά την ανάγνωση της ιδιότητας. Το αποτέλεσμα αυτής της συνάρτησης γίνεται η τιμή της ιδιότητας. Δεν δέχεται ορίσματα.set: Συνάρτηση που καλείται κατά την εγγραφή στην ιδιότητα. Δέχεται ένα όρισμα — τη νέα τιμή.enumerable: Λογική τιμή (όπως στους δεδομένους περιγραφείς).configurable: Λογική τιμή (όπως στους δεδομένους περιγραφείς).
Οι περιγραφείς δεν μπορούν να αναμειχθούν: μια ιδιότητα έχει είτε value και writable, είτε get και set.
Οι περιγραφείς χρησιμοποιούνται για τον έλεγχο των ιδιοτήτων του αντικειμένου σε χαμηλότερο επίπεδο από την απλή ανάθεση, ειδικά μέσω μεθόδων όπως Object.defineProperty(), Object.defineProperties(), Object.getOwnPropertyDescriptor(), Object.getOwnPropertyDescriptors(), Object.create().
Παράδειγμα δημιουργίας ιδιότητας με περιγραφή δεδομένων:
// Δημιουργία κενού αντικειμένου
const obj = {};
// Ορισμός ιδιότητας 'name' με περιγραφή δεδομένων
Object.defineProperty(obj, 'name', {
value: 'Alice',
writable: false, // Η ιδιότητα δεν μπορεί να αλλάξει
enumerable: true, // Η ιδιότητα θα είναι επεξεργάσιμη
configurable: false // Τα χαρακτηριστικά της ιδιότητας δεν μπορούν να αλλάξουν, η ιδιότητα δεν μπορεί να διαγραφεί
});
console.log(obj.name); // Θα εμφανίσει: Alice
// Προσπάθεια αλλαγής της ιδιότητας (θα αγνοηθεί σε αυστηρή λειτουργία ή θα ρίξει σφάλμα)
obj.name = 'Bob';
console.log(obj.name); // Θα εμφανίσει: Alice
// Προσπάθεια διαγραφής της ιδιότητας (θα αγνοηθεί ή θα ρίξει σφάλμα)
delete obj.name;
console.log(obj.name); // Θα εμφανίσει: Alice
Παράδειγμα δημιουργίας ιδιότητας με περιγραφή accessor:
// Δημιουργία αντικειμένου με ιδιωτική μεταβλητή
const user = {
_firstName: 'John', // Συμβατική ιδιωτική μεταβλητή
_lastName: 'Doe'
};
// Ορισμός ιδιότητας 'fullName' με περιγραφή accessor
Object.defineProperty(user, 'fullName', {
get() {
// Getter: επιστρέφει το πλήρες όνομα
return `${this._firstName} ${this._lastName}`;
},
set(value) {
// Setter: διαχωρίζει το πλήρες όνομα σε μέρη και ενημερώνει τις ιδιωτικές μεταβλητές
const parts = value.split(' ');
this._firstName = parts[0];
this._lastName = parts[1];
},
enumerable: true, // Η ιδιότητα θα είναι επεξεργάσιμη
configurable: true // Τα χαρακτηριστικά της ιδιότητας μπορούν να αλλάξουν, η ιδιότητα μπορεί να διαγραφεί
});
console.log(user.fullName); // Θα εμφανίσει: John Doe
user.fullName = 'Peter Pan';
console.log(user._firstName); // Θα εμφανίσει: Peter
console.log(user._lastName); // Θα εμφανίσει: Pan
console.log(user.fullName); // Θα εμφανίσει: Peter Pan
Η χρήση περιγραφέων επιτρέπει τη δημιουργία αμετάβλητων ιδιοτήτων, ιδιοτήτων με τεμπέλικο υπολογισμό, ιδιοτήτων με έλεγχο πρόσβασης (getters/setters) και πιο ευέλικτο έλεγχο της συμπεριφοράς των αντικειμένων.