Sobes.tech
Middle+

Təsvirçilər haqqında nə bilirsiniz?

sobes.tech Süni İntellekt

AI-dan cavab

JavaScript-də təsvirlər obyektlərdir və müxtəlif obyekt xüsusiyyətlərini, məsələn, dəyərini (value), yazıla bilmə imkanını (writable), siyahıya alınma imkanını (enumerable) və konfiqurasiya imkanını (configurable) təsvir edir. Həmçinin, getter və setter-ləri olan təsvirlər mövcuddur.

İki növ təsvir mövcuddur:

  • Məlumat təsvirləri: Xüsusiyyətin dəyərini ehtiva edir.

    • value: Xüsusiyyətin dəyəri. Hər hansı keçərli məlumat tipi ola bilər.
    • writable: Boolean. Əgər true isə, xüsusiyyətin dəyəri dəyişdirilə bilər (obj.prop = newValue). Standart olaraq false accessor xüsusiyyətlər üçün və true məlumat xüsusiyyətləri üçün, adi təyin etmə ilə yaradılanlar üçün.
    • enumerable: Boolean. Əgər true isə, xüsusiyyət obyektin xüsusiyyətləri arasında iterasiya zamanı görünəcək (məsələn, for...in dövrü və ya Object.keys() ilə). Standart olaraq false Object.defineProperty ilə əlavə olunan xüsusiyyətlər üçün və true adi təyin etmə ilə yaradılanlar üçün.
    • configurable: Boolean. Əgər true isə, təsvirin xüsusiyyətləri (dəyər və writable xaric, dəyişdirildikdə accessor-ə çevrilənlər) dəyişdirilə bilər və xüsusiyyət silinə bilər. Standart olaraq false Object.defineProperty ilə əlavə olunanlar üçün (dəyər xaric), və true adi təyin etmə ilə yaradılanlar üçün. Bir dəfə konfiqurasiya ediləndən sonra, dəyişdirilə bilməz. writabletrue-dən false-a azalda bilərsiniz, amma getter/setter-də non-configurable olduqda, əksinə edilə bilməz.
  • Accessor təsvirləri: Xüsusiyyətin alınması (getter) və ya təyin edilməsi (setter) üçün funksiyaları təyin edir.

    • get: Xüsusiyyət oxunduqda çağırılan funksiya. Bu funksiyanın nəticəsi xüsusiyyətin dəyəri olur. Argument qəbul etmir.
    • set: Xüsusiyyətə yazıldıqda çağırılan funksiya. Bir arqument qəbul edir — yeni təyin olunan dəyər.
    • enumerable: Boolean (məlumat təsvirləri ilə eynidir).
    • configurable: Boolean (məlumat təsvirləri ilə eynidir).

Təsvirləri qarışdırmaq olmaz: xüsusiyyət ya valuewritable-a, ya da getset-ə malikdir.

Təsvirlər obyektin xüsusiyyətlərini aşağı səviyyədə idarə etmək üçün istifadə olunur, xüsusən Object.defineProperty(), Object.defineProperties(), Object.getOwnPropertyDescriptor(), Object.getOwnPropertyDescriptors(), Object.create() metodları vasitəsilə.

Məlumat təsviri ilə xüsusiyyət yaratma nümunəsi:

// Boş obyekt yaradılır
const obj = {};

// `name` xüsusiyyətini məlumat təsviri ilə təyin edir
Object.defineProperty(obj, 'name', {
  value: 'Alice',
  writable: false, // Xüsusiyyət dəyişdirilə bilməz
  enumerable: true, // Xüsusiyyət siyahıya alınacaq
  configurable: false // Xüsusiyyətin xüsusiyyətləri dəyişdirilə bilməz, silinə bilməz
});

console.log(obj.name); // Çıxış: Alice

// Xüsusiyyəti dəyişdirməyə cəhd (strict rejimdə və ya səhv atacaq)
obj.name = 'Bob';
console.log(obj.name); // Çıxış: Alice

// Xüsusiyyəti silməyə cəhd (silmə mümkün deyil və ya səhv atacaq)
delete obj.name;
console.log(obj.name); // Çıxış: Alice

Accessor təsviri ilə xüsusiyyət yaratma nümunəsi:

// Özəl dəyişənlərlə obyekt yaradılır
const user = {
  _firstName: 'John', // Konvensiya ilə özəl dəyişən
  _lastName: 'Doe'
};

// `fullName` xüsusiyyətini accessor təsviri ilə təyin edir
Object.defineProperty(user, 'fullName', {
  get() {
    // Getter: tam adı qaytarır
    return `${this._firstName} ${this._lastName}`;
  },
  set(value) {
    // Setter: tam adı hissələrə bölür və özəl dəyişənləri yeniləyir
    const parts = value.split(' ');
    this._firstName = parts[0];
    this._lastName = parts[1];
  },
  enumerable: true, // Siyahıya alınacaq
  configurable: true // Xüsusiyyətin xüsusiyyətləri dəyişdirilə bilər, silinə bilər
});

console.log(user.fullName); // Çıxış: John Doe

user.fullName = 'Peter Pan';
console.log(user._firstName); // Çıxış: Peter
console.log(user._lastName); // Çıxış: Pan
console.log(user.fullName); // Çıxış: Peter Pan

Təsvirlərdən istifadə edərək dəyişməz xüsusiyyətlər, tələbinə görə hesablanan xüsusiyyətlər, girişə nəzarət edən xüsusiyyətlər (getter/setter) və obyektin davranışını daha elastik idarə etmək mümkündür.