JavaScript үндэс / Нууцлал (Encapsulation)

Нууцлал (Encapsulation)

Encapsulation буюу нууцлал нь class-ын дотоод өгөгдлийг гаднаас шууд өөрчлөхөөс хамгаалах ойлголт юм. Бодит амьдралд автомашины хөдөлгүүрийг шууд гараараа тохируулдаггүй — жолооны хүрд, хурдасгуур зэрэг тусгайлан зориулсан хэрэглүүрээр удирддаг. Class-д мөн адил: өгөгдлийг шууд биш, зөвхөн тусгай методоор авах, өөрчлөх боломж олгоно.

Private fields — # тэмдэг

JavaScript-д # тэмдгийг нэрийн өмнө бичвэл тухайн property гаднаас харагдахгүй, хандах боломжгүй болно. Үүнийг private field гэнэ.

javascript
class Данс {
  #үлдэгдэл = 0; // private — гаднаас шууд хандах боломжгүй

  constructor(эзэмшигч) {
    this.эзэмшигч = эзэмшигч;
  }

  мөнгө_оруулах(дүн) {
    if (дүн > 0) {
      this.#үлдэгдэл += дүн;
      console.log(`+${дүн}₮ орлоо. Үлдэгдэл: ${this.#үлдэгдэл}₮`);
    }
  }

  үлдэгдэл_харах() {
    return this.#үлдэгдэл;
  }
}

const данс = new Данс("Болд");
данс.мөнгө_оруулах(100_000);
// +100000₮ орлоо. Үлдэгдэл: 100000₮

console.log(данс.үлдэгдэл_харах()); // 100000

// console.log(данс.#үлдэгдэл); ← АЛДАА гарна — хандах боломжгүй

Getter ба Setter

get ба set түлхүүр үгс нь private өгөгдлийг аюулгүйгээр унших, бичих аргыг олгоно. Гаднаас харахад энгийн property мэт ажилладаг.

javascript
class Оюутан {
  #оноо = 0;

  constructor(нэр) {
    this.нэр = нэр;
  }

  get оноо() {
    return this.#оноо;
  }

  set оноо(утга) {
    if (утга < 0 || утга > 100) {
      console.log("Оноо 0–100 хооронд байх ёстой!");
      return;
    }
    this.#оноо = утга;
  }
}

const болд = new Оюутан("Болд");

болд.оноо = 85; // setter дуудагдана
console.log(болд.оноо); // getter дуудагдана → 85

болд.оноо = 150; // "Оноо 0–100 хооронд байх ёстой!"
console.log(болд.оноо); // 85 — өөрчлөгдсөнгүй

Яагаад нууцлал чухал вэ?

Нууцлал ашигласнаар:

javascript
class Нууц_үг {
  #утга;

  constructor(нууц_үг) {
    this.#утга = нууц_үг;
  }

  шалгах(оруулсан) {
    return this.#утга === оруулсан;
  }
  // #утга-г гаднаас хэзээ ч уншиж чадахгүй
}

const нууц = new Нууц_үг("mn@2025#secure");

console.log(нууц.шалгах("mn@2025#secure")); // true
console.log(нууц.шалгах("1234")); // false
// console.log(нууц.#утга) ← АЛДАА — нууц үг нь хамгаалагдсан байна

Буруу утга оруулахаас сэргийлж, өгөгдөл зөвхөн тодорхойлсон дүрмийн дагуу өөрчлөгдөнө. Том системд энэ нь аюулгүй байдлыг хангах гол хэрэгсэл болдог.

Дараагийн хичээлд:

ES6 модулиуд — import ба export ашиглан кодоо олон файлд хэрхэн хуваах, дахин ашиглах талаар үзнэ.