Karena es6 tidak mendukung kelas bersarang, saya telah menambahkan kelas bersarang ke pengambil statis induknya. Sebagai contoh:

class Dictionary {
  static get Category () {
    return class Category {
      static is (inst) {
        return inst instanceof Category
      }
      constructor () {}
    }
  }
}

Namun, saya mengalami masalah dengan instanceof. Saya ingin memastikan variabel yang diberikan adalah contoh yang benar.

const test = new Dictionary.Category()
const ctor = Dictionary.Category

console.log(test instanceof Dictionary.Category) // false
console.log(Dictionary.Category.is(test)) // false
console.log(test instanceof ctor) // false
console.log(test.__proto__.constructor === ctor) // false
console.log(test.constructor === ctor) // false
console.log(test.constructor, ctor) // both function Category()
console.log(new Dictionary() instanceof Dictionary) // true (sanity check)

Sampai sekarang, saya telah menguji constructor.name tetapi ini terbatas. Bagaimana saya bisa memecahkan masalah ini?

Berkat jawaban di bawah ini yang menunjukkan masalahnya, berikut adalah solusi yang berfungsi:

class Dictionary {
  static get Category () {
    Dictionary.__Category = Dictionary.__Category || class Category {
      constructor () {}
    }
    return Dictionary.__Category
  }
}
2
Twifty 18 Maret 2020, 07:26

1 menjawab

Jawaban Terbaik

Ini gagal karena setiap akses properti pengambil membuat kelas yang sama sekali baru, kebetulan memiliki semua hal yang sama dengan yang Anda dapatkan terakhir kali Anda mengakses pengambil.

Jika Anda menginginkan properti bersarang, gunakan properti, mis.

class Dictionary {
}
Dictionary.Category = class Category {
  static is (inst) {
    return inst instanceof Category
  }
  constructor () {}
};
2
loganfsmyth 18 Maret 2020, 04:49