Kunci jawaban 06 Latihan Objek.

6.1 Tipe Vektor

class Vec {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
  plus(lain) {
    return new Vec(this.x + lain.x, this.y + lain.y);
  }
  minus(lain) {
    return new Vec(this.x - lain.x, this.y - lain.y);
  }
  get length() {
    return Math.sqrt(this.x ** 2 + this.y ** 2);
  }
}

Kenapa: plus dan minus gak mengubah this, mereka mengembalikan Vec baru — jadi murni dan aman dirangkai. get length() bikin length bisa dibaca seperti properti biasa (v.length) padahal sebenarnya memanggil method. Class ini dipakai lagi di game platform 16 Proyek Game Platform.

→ Soal: 06 Latihan Objek > 6.1 Tipe Vektor

6.2 Group

class Group {
  #members = [];
 
  add(nilai) {
    if (!this.has(nilai)) this.#members.push(nilai);
  }
  delete(nilai) {
    this.#members = this.#members.filter(m => m !== nilai);
  }
  has(nilai) {
    return this.#members.includes(nilai);
  }
  static from(iterable) {
    let g = new Group();
    for (let nilai of iterable) g.add(nilai);
    return g;
  }
}

Kenapa: #members private, jadi tersembunyi dari luar; diinisialisasi [] langsung sehingga gak perlu constructor. add cek dulu supaya gak ada duplikat. delete menimpa #members dengan array baru tanpa nilai itu. from adalah method static (jalan di Group, bukan di instance) yang bikin group baru dari iterable apa pun.

→ Soal: 06 Latihan Objek > 6.2 Group

6.3 Group yang Bisa Diiterasi

class Group {
  #members = [];
 
  add(nilai) {
    if (!this.has(nilai)) this.#members.push(nilai);
  }
  delete(nilai) {
    this.#members = this.#members.filter(m => m !== nilai);
  }
  has(nilai) {
    return this.#members.includes(nilai);
  }
  static from(iterable) {
    let g = new Group();
    for (let nilai of iterable) g.add(nilai);
    return g;
  }
 
  [Symbol.iterator]() {
    return new GroupIterator(this.#members);
  }
}
 
class GroupIterator {
  #members;
  #posisi = 0;
  constructor(members) {
    this.#members = members;
  }
  next() {
    if (this.#posisi >= this.#members.length) {
      return {done: true};
    }
    let value = this.#members[this.#posisi];
    this.#posisi++;
    return {value, done: false};
  }
}

Kenapa: for/of mengharapkan objek punya method [Symbol.iterator]() yang mengembalikan iterator — objek dengan next() yang memberi {value, done}. GroupIterator menyimpan referensi array anggota dan sebuah #posisi yang naik tiap next; begitu posisi melewati panjang, ia mengembalikan {done: true} dan loop berhenti. Strukturnya sama dengan iterator list di bab.

→ Soal: 06 Latihan Objek > 6.3 Group yang Bisa Diiterasi