Teknologian jakaminen

ES6 Reflect Yksityiskohtainen selitys (3)

2024-07-12

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

Reflect-objekti, kuten Proxy-objekti, on ES6:n uusi API käyttöobjekteille. Heijastavat esineet on suunniteltu neljään tarkoitukseen.

  1. Aseta joitain Object-objektin menetelmiä, jotka ovat selvästi kielen sisäisiä (kuten Object.defineProperty), Reflect-objektiin. Tässä vaiheessa jotkin menetelmät otetaan käyttöön sekä Object- että Reflect-objekteissa, ja tulevaisuudessa uusia menetelmiä otetaan käyttöön vain Reflect-objekteissa. Toisin sanoen kielen sisäiset menetelmät saadaan Reflect-objektista.
  2. Muokkaa joidenkin Object-menetelmien palautustuloksia tehdäksesi niistä järkevämpiä. Esimerkiksi Object.defineProperty(obj, nimi, desc) antaa virheen, kun ominaisuutta ei voida määrittää, kun taas Reflect.defineProperty(obj, nimi, desc) palauttaa arvon 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. Olkoon objektioperaatioiden toiminnallinen käyttäytyminen. Jotkut Object-operaatiot ovat välttämättömiä, kuten nimi obj:ssa ja poista obj[nimi], mutta Reflect.has(obj, nimi) ja Reflect.deleteProperty(obj, nimi) muuttavat ne toiminnallisiksi käyttäytymismalleiksi.
// 老写法
'assign' in Object // true
// 新写法
Reflect.has(Object, 'assign') // true
  • 1
  • 2
  • 3
  • 4
  1. Reflect-objektin menetelmät vastaavat Proxy-objektin menetelmiä yksi yhteen Niin kauan kuin se on Proxy-objektin menetelmä, vastaava menetelmä löytyy Reflect-objektista. Tämän ansiosta Proxy-objekti voi helposti kutsua vastaavaa Reflect-metodia oletuskäyttäytymisen loppuunsaattamiseksi ja toimia perustana käyttäytymisen muokkaamiselle. Toisin sanoen, riippumatta siitä, kuinka Proxy muuttaa oletuskäyttäytymistä, voit aina saada oletuskäyttäytymisen Reflectissä.
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

Välityspalvelinmenetelmä sieppaa kohdeobjektin attribuuttien määrityskäyttäytymisen. Se käyttää Reflect.set-menetelmää arvojen määrittämiseen objektin ominaisuuksille varmistaen, että alkuperäinen toiminta on suoritettu loppuun, ja ottaa sitten käyttöön lisätoimintoja.

Yleisesti käytetyt menetelmät:

Reflect.get(kohde, propertyKey[, vastaanotin]): Hanki objektin ominaisuudet.
Reflect.set(kohde, ominaisuusKey, arvo[, vastaanottaja]): Aseta objektin ominaisuudet.
Reflect.has(target, propertyKey): Määritä, onko ominaisuus olemassa objektissa.
Reflect.deleteProperty(target, propertyKey): Poista objektin ominaisuudet.
Reflect.ownKeys(target): Palauttaa joukon itse objektin kaikista ominaisuuksista.
Reflect.getOwnPropertyDescriptor(target, propertyKey): Hanki objektin ominaisuuden kuvaaja.
Reflect.defineProperty(kohde, propertyKey, attribuutit): Määritä tai muokkaa objektin ominaisuuksia.
Reflect.preventExtensions(target): Estä objektin laajentaminen.
Reflect.isExtensible(target): Määritä, onko objekti laajennettavissa.
Reflect.getExtension(target): Hanki objektin prototyyppi.
Reflect.setPrototypeOf(kohde, prototyyppi): Aseta objektin prototyyppi.

Esimerkki 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

Esimerkki 2: Reflect.setin käyttö

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

Esimerkki 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

Esimerkki 4: Reflect.deleteProperty-sovelluksen käyttö

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

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

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

Esimerkki 5: Reflect.ownKeysin käyttäminen

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

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

Esimerkki 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

Esimerkki 7: Reflect.isExtensible käyttö

let obj = { name: "Alice" };

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

Esimerkki 8: Reflect.getPrototypeOf:n ja Reflect.setPrototypeOf:n käyttö

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-objekti tarjoaa joukon menetelmiä, jotka vastaavat välityspalvelinten ansoja, mikä tekee JavaScript-toimintojen sieppaamisesta intuitiivisempaa ja kätevämpää. Reflectin käyttäminen varmistaa toimintojen johdonmukaisuuden ja odotetun käyttäytymisen, varsinkin kun vikaolosuhteet tai virheet on tunnistettava tarkasti.