Κοινή χρήση τεχνολογίας

ES6 Reflect Λεπτομερής Εξήγηση (3)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Το αντικείμενο Reflect, όπως το αντικείμενο Proxy, είναι ένα νέο API που παρέχεται από το ES6 για αντικείμενα λειτουργίας. Τα αντικείμενα Reflect έχουν σχεδιαστεί για 4 σκοπούς.

  1. Τοποθετήστε ορισμένες μεθόδους του αντικειμένου Object που είναι προφανώς εσωτερικές στη γλώσσα (όπως το Object.defineProperty) στο αντικείμενο Reflect. Σε αυτό το στάδιο, ορισμένες μέθοδοι αναπτύσσονται τόσο σε αντικείμενα αντικειμένου όσο και σε αντικείμενα Reflect και νέες μέθοδοι στο μέλλον θα αναπτύσσονται μόνο σε αντικείμενα Reflect. Με άλλα λόγια, οι εσωτερικές μέθοδοι της γλώσσας μπορούν να ληφθούν από το αντικείμενο Reflect.
  2. Τροποποιήστε τα αποτελέσματα επιστροφής ορισμένων μεθόδων Object για να τα κάνετε πιο λογικά. Για παράδειγμα, το Object.defineProperty(obj, όνομα, desc) θα εμφανίσει ένα σφάλμα όταν η ιδιότητα δεν μπορεί να οριστεί, ενώ το Reflect.defineProperty(obj, όνομα, desc) θα επιστρέψει false.
// 老写法
try {
  Object.defineProperty(target, property, attributes);
  // success
} catch (e) {
  // failure
}
// 新写法
if (Reflect.defineProperty(target, property, attributes)) {
  // success
} else {
  // failure
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  1. Αφήστε τις πράξεις αντικειμένων να γίνουν λειτουργικές συμπεριφορές. Ορισμένες λειτουργίες Αντικειμένου είναι επιτακτικές, όπως το όνομα στο obj και η διαγραφή του obj[όνομα], αλλά το Reflect.has(obj, name) και το Reflect.deleteProperty(obj, όνομα) τις μετατρέπουν σε λειτουργικές συμπεριφορές.
// 老写法
'assign' in Object // true
// 新写法
Reflect.has(Object, 'assign') // true
  • 1
  • 2
  • 3
  • 4
  1. Οι μέθοδοι του αντικειμένου Reflect αντιστοιχούν στις μεθόδους του αντικειμένου Proxy one-to-one Εφόσον είναι μέθοδος του αντικειμένου Proxy, η αντίστοιχη μέθοδος μπορεί να βρεθεί στο αντικείμενο Reflect. Αυτό επιτρέπει στο αντικείμενο Proxy να καλεί εύκολα την αντίστοιχη μέθοδο Reflect για να ολοκληρώσει την προεπιλεγμένη συμπεριφορά και να χρησιμεύσει ως βάση για την τροποποίηση της συμπεριφοράς. Με άλλα λόγια, ανεξάρτητα από το πώς ο Proxy τροποποιεί την προεπιλεγμένη συμπεριφορά, μπορείτε πάντα να λάβετε την προεπιλεγμένη συμπεριφορά στο Reflect.
Proxy(target, {
  set: function(target, name, value, receiver) {
    var success = Reflect.set(target, name, value, receiver);
    if (success) {
      console.log('property ' + name + ' on ' + target + ' set to ' + value);
    }
    return success;
  }
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Η μέθοδος Proxy παρεμποδίζει τη συμπεριφορά εκχώρησης χαρακτηριστικών του αντικειμένου προορισμού. Χρησιμοποιεί τη μέθοδο Reflect.set για να εκχωρήσει τιμές στις ιδιότητες του αντικειμένου, διασφαλίζοντας ότι η αρχική συμπεριφορά έχει ολοκληρωθεί και, στη συνέχεια, αναπτύσσει πρόσθετη λειτουργικότητα.

Μέθοδοι που χρησιμοποιούνται συνήθως:

Reflect.get(target, propertyKey[, receiver]): Λάβετε τις ιδιότητες του αντικειμένου.
Reflect.set(target, propertyKey, value[, receiver]): Ορίστε τις ιδιότητες του αντικειμένου.
Reflect.has(target, propertyKey): Προσδιορίστε εάν η ιδιότητα υπάρχει στο αντικείμενο.
Reflect.deleteProperty(target, propertyKey): Διαγράψτε τις ιδιότητες του αντικειμένου.
Reflect.ownKeys(target): Επιστρέφει έναν πίνακα με όλες τις ιδιότητες του ίδιου του αντικειμένου.
Reflect.getOwnPropertyDescriptor(target, propertyKey): Λάβετε τον περιγραφέα της ιδιότητας αντικειμένου.
Reflect.defineProperty(target, propertyKey, χαρακτηριστικά): Ορισμός ή τροποποίηση των ιδιοτήτων του αντικειμένου.
Reflect.preventExtensions(target): Αποτρέψτε την επέκταση του αντικειμένου.
Reflect.isExtensible(target): Προσδιορίστε εάν το αντικείμενο είναι επεκτάσιμο.
Reflect.getExtension(target): Λάβετε το πρωτότυπο του αντικειμένου.
Reflect.setPrototypeOf(target, prototype): Ορίστε το πρωτότυπο του αντικειμένου.

Παράδειγμα 1: Χρήση Reflect.get

let obj = { name: "Alice", age: 25 };
let propName = "name";

console.log(Reflect.get(obj, propName)); // 输出:Alice
console.log(Reflect.get(obj, "gender")); // 输出:undefined
  • 1
  • 2
  • 3
  • 4
  • 5

Παράδειγμα 2: Χρήση Reflect.set

let obj = { name: "Alice" };

// 设置属性
console.log(Reflect.set(obj, "age", 30)); // 输出:true

console.log(obj); // 输出:{ name: "Alice", age: 30 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Παράδειγμα 3: Χρήση Reflect.has

let obj = { name: "Alice" };

console.log(Reflect.has(obj, "name")); // 输出:true
console.log(Reflect.has(obj, "age"));  // 输出:false
  • 1
  • 2
  • 3
  • 4

Παράδειγμα 4: Χρήση Reflect.deleteProperty

let obj = { name: "Alice", age: 30 };

// 删除属性
console.log(Reflect.deleteProperty(obj, "age")); // 输出:true

console.log(obj); // 输出:{ name: "Alice" }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Παράδειγμα 5: Χρήση Reflect.ownKeys

let obj = { name: "Alice", age: 30 };

console.log(Reflect.ownKeys(obj)); // 输出:["name", "age"]
  • 1
  • 2
  • 3

Παράδειγμα 6: Χρήση του Reflect.preventExtensions

let obj = { name: "Alice" };

// 防止对象被扩展
console.log(Reflect.preventExtensions(obj)); // 输出:true

// 尝试添加新属性
console.log(Reflect.set(obj, "age", 30)); // 输出:false
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Παράδειγμα 7: Χρήση Reflect.isExtensible

let obj = { name: "Alice" };

console.log(Reflect.isExtensible(obj)); // 输出:true
  • 1
  • 2
  • 3

Παράδειγμα 8: Χρήση Reflect.getPrototypeOf και Reflect.setPrototypeOf

let proto = { sayHello: function() { console.log("Hello!"); }};
let obj = Object.create(proto);

console.log(Reflect.getPrototypeOf(obj) === proto); // 输出:true

// 设置新原型
let newProto = { sayGoodbye: function() { console.log("Goodbye!"); }};
Reflect.setPrototypeOf(obj, newProto);

console.log(obj.sayGoodbye); // 可以访问新原型上的方法
obj.sayGoodbye(); // 输出:Goodbye!
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Το αντικείμενο Reflect παρέχει ένα σύνολο μεθόδων που αντιστοιχούν σε παγίδες διακομιστή μεσολάβησης, καθιστώντας την υποκλοπή λειτουργιών JavaScript πιο διαισθητική και βολική. Η χρήση του Reflect διασφαλίζει τη συνέπεια και την αναμενόμενη συμπεριφορά των λειτουργιών, ειδικά όταν οι συνθήκες αστοχίας ή τα σφάλματα πρέπει να αποτυπωθούν ρητά.