Sobes.tech
Middle+

Τι ξέρεις για τους περιγραφείς;

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) και πιο ευέλικτο έλεγχο της συμπεριφοράς των αντικειμένων.