Ką žinai apie aprašytojus?
sobes.tech AI
Atsakymas iš AI
JavaScript'e deskriptoriai yra objektai, apibūdinantys įvairias objekto savybes, tokias kaip jos reikšmė (value), rašymo galimybė (writable), perėjimo galimybė (enumerable) ir konfigūravimo galimybė (configurable). Taip pat yra getter ir setter deskriptoriai.
Yra du deskriptorių tipai:
-
Duomenų deskriptoriai: apima savybės reikšmę:
value: savybės reikšmė. Gali būti bet koks galiojantis duomenų tipas.writable: loginė reikšmė. Jeitrue, savybės reikšmė gali būti keičiama (obj.prop = newValue). Jeifalse, negali būti keičiama.enumerable: loginė reikšmė. Jeitrue, savybė bus matoma per iteraciją per objekto savybes (pvz.,for...incikle arba naudojantObject.keys()). Paprastai,false— pridedant perObject.defineProperty, irtrue— pridedant paprastu priskyrimu.configurable: loginė reikšmė. Jeitrue, deskriptoriaus savybės gali būti keičiamos ir savybė gali būti ištrinta. Paprastai,false— pridedant perObject.defineProperty(išskyrusvalue), irtrue— pridedant paprastu priskyrimu. Jei nustatyta kaipnon-configurable, negali būti keičiama atgal. Galite sumažintiwritablenuotrueikifalse, bet ne atvirkščiai,non-configurablegetter/setter.
-
Aksesorių deskriptoriai: apibrėžia funkcijas, kurios bus iškviestos, kai gaunama (getter) arba nustatoma (setter) savybės reikšmė:
get: funkcija, iškviečiama, kai skaitoma savybė. Šios funkcijos rezultatas tampa savybės reikšme. Nereikalauja argumentų.set: funkcija, iškviečiama, kai rašoma į savybę. Priima vieną argumentą — naują nustatomą reikšmę.enumerable: loginė reikšmė.configurable: loginė reikšmė.
Deskriptoriai negali būti maišomi: savybė turi būti arba value ir writable, arba get ir set.
Deskriptoriai naudojami valdyti objekto savybes žemesniame lygyje nei įprastas priskyrimas, ypač naudojant Object.defineProperty(), Object.defineProperties(), Object.getOwnPropertyDescriptor(), Object.getOwnPropertyDescriptors(), Object.create() metodus.
Pavyzdys, kaip sukurti savybę su duomenų deskriptoriu:
// Sukuriamas tuščias objektas
const obj = {};
// Apibrėžiame savybę `name` su duomenų deskriptoriu
Object.defineProperty(obj, 'name', {
value: 'Alice',
writable: false, // Savybė negali būti keičiama
enumerable: true, // Savybė bus išvardijama
configurable: false // Savybės charakteristikos negali būti keičiamos ir savybė negali būti ištrinta
});
console.log(obj.name); // Išves: Alice
// Bandymas pakeisti savybę (bus ignoruojamas arba išmes klaidą)
obj.name = 'Bob';
console.log(obj.name); // Išves: Alice
// Bandymas ištrinti savybę (bus ignoruojamas arba išmes klaidą)
delete obj.name;
console.log(obj.name); // Išves: Alice
Pavyzdys, kaip sukurti savybę su aksesorių deskriptoriu:
// Sukuriamas objektas su privačia kintamąja
const user = {
_firstName: 'John', // Privatus kintamasis pagal susitarimą
_lastName: 'Doe'
};
// Apibrėžiame savybę `fullName` su aksesorių deskriptoriu
Object.defineProperty(user, 'fullName', {
get() {
// Getter: grąžina pilną vardą
return `${this._firstName} ${this._lastName}`;
},
set(value) {
// Setter: padalija pilną vardą į dalis ir atnaujina privačius kintamuosius
const parts = value.split(' ');
this._firstName = parts[0];
this._lastName = parts[1];
},
enumerable: true, // Bus išvardijama
configurable: true // Charakteristikos gali būti keičiamos, savybė gali būti ištrinta
});
console.log(user.fullName); // Išves: John Doe
user.fullName = 'Peter Pan';
console.log(user._firstName); // Išves: Peter
console.log(user._lastName); // Išves: Pan
console.log(user.fullName); // Išves: Peter Pan
Deskriptoriai leidžia kurti nekintamas savybes, vėlinio skaičiavimo savybes, prieigos kontrolės savybes (getteriai/setteriai) ir lankstesnį objektų elgesio valdymą.