Sobes.tech
Junior

Proqramın icrası zamanı dinamik olaraq sinifləri necə yarada bilərik?

sobes.tech Süni İntellekt

AI-dan cavab

JavaScript-də siniflər, prototip irsinin sintaktik şəkərini təmsil edən, icra zamanı ənənəvi mənada "yaradılmır". Ancaq, biz dinamik olaraq konstruktor funksiyaları (sınıflar yaranmadan əvvəl onların analoqu idilər) və ya müəyyən xüsusiyyətlər və metodlara malik sinif nümunələri yarada bilərik.

Dinamik yaradılma üsulları:

  • Function konstruktorundan istifadə etməklə:

    // Dinamik olaraq konstruktor funksiyası yaradılır
    const DynamicClassConstructor = new Function('name', `
      this.name = name;
      this.sayHello = function() {
        console.log('Salam, mənim adım ' + this.name);
      };
    `);
    
    // Dinamik konstruktor ilə sinif nümunəsi yaradılır
    const dynamicInstance = new DynamicClassConstructor('Alysa');
    dynamicInstance.sayHello(); // Salam, mənim adım Alysa
    

    Bu metod ən az yayılmışdır, çünki təhlükəsiz deyil (sətiri kod kimi icra edir) və səhvlərin tapılmasında çətindir.

  • Fabrika funksiyalarından istifadə etməklə:

    // Fabrikafunksiya, müəyyən xüsusiyyətlər və metodlar olan obyekt qaytarır
    function createDynamicObject(type) {
      const baseObject = {
        id: Math.random() // Dinamik xüsusiyyət nümunəsi
      };
    
      if (type === 'istifadəçi') {
        return {
          ...baseObject,
          role: 'istifadəçi',
          greet: function() {
            console.log('Mən istifadəçiyəm!');
          }
        };
      } else if (type === 'idarəçi') {
        return {
          ...baseObject,
          role: 'idarəçi',
          greet: function() {
            console.log('Mən idarəçiyəm!');
          }
        };
      }
      return baseObject;
    }
    
    const user = createDynamicObject('istifadəçi');
    user.greet(); // Mən istifadəçiyəm!
    
    const admin = createDynamicObject('idarəçi');
    admin.greet(); // Mən idarəçiyəm!
    

    Fabrika funksiyaları daha çevik və təhlükəsizdir, işləmə zamanı müxtəlif konfiqurasiyalara malik obyektlər yarada bilir.

  • eval istifadə etməklə (tövsiyə edilmir):

    // `eval` istifadə edərək sinif yaradılması (çox təhlükəli və tövsiyə edilmir)
    const className = 'MyDynamicClass';
    const classDefinition = `
      class ${className} {
        constructor(value) {
          this.value = value;
        }
        printValue() {
          console.log(this.value);
        }
      }
    `;
    
    eval(classDefinition);
    
    const dynamicInstanceEval = new MyDynamicClass('dynamik dəyər');
    dynamicInstanceEval.printValue(); // dinamik dəyər
    

    eval istifadəsi təhlükəsizlik, performans və səhvlərin tapılmasında çətinliklər səbəbindən çox tövsiyə edilmir.

Vacib nöqtələr:

  • "Dinamik sinif yaradılması" termini JavaScript-də ümumiyyətlə, icra zamanı müəyyən bir struktur və davranışa malik obyektlərin yaradılmasına istinad edir, class yapıcılarının yaradılmasına deyil.
  • Əksər ssenarilər üçün, fabrika funksiyaları və ya sadə obyekt yaradılması, lazım olan xüsusiyyətlərlə, daha üstün və təhlükəsiz yanaşmalardır.
  • Framework və kitabxanalarla işləyərkən, onlar bu prinsiplərə əsaslanan dinamik komponent və ya obyekt yaradılması mexanizmlərini təmin edə bilərlər.