Javascript - Парадигма общего указателя - PullRequest
0 голосов
/ 15 декабря 2018

Итак, я пишу API в Javascript.Идеальные требования включают в себя поддержку такой структуры:

  • Существует два класса: class Core и class Public.Оба имеют член id.
  • Не может быть нескольких экземпляров Core с одинаковым id, но каждый должен иметь уникальный id;однако может быть любое количество экземпляров Public с одинаковыми экземплярами id.
  • Public, каждый из которых имеет одну ссылку на экземпляр класса Core с соответствующим значением для id.
  • Core экземпляры должны собираться мусором, как только последний экземпляр Public, указывающий на него, собирается сборщиком мусора.
  • Таким образом, когда создается и передается новый экземпляр Publicid, он собирает и присваивает свою ссылку либо существующему экземпляру Core, если таковой существует, либо новому экземпляру Core, если нет.

и предпочтительно (хотя и не совсем)обязательно):

  • Когда отбрасывается последняя ссылка на экземпляр Core, на нем запускается метод (т. е. деструктор)

Также, как яя пишу это в ES6, WeakMaps, WebAssembly и любом другом современном JS API, допустим в ответе.

Возможна ли эта структура в Javascript?Если да, какова будет структура такой реализации?Или это полностью выходит за рамки возможностей Javascript?

1 Ответ

0 голосов
/ 15 декабря 2018

Возможна ли эта структура в Javascript?

Да, это так.Однако вы не можете никоим образом перехватить сборку мусора, если все ссылки на объект потерялись, он исчезнет молча, никто не заметит этого.Поэтому, если вы хотите это заметить, вы должны вызвать это явно:

 class Reference {
   constructor(to) { 
     this.to = to; 
     to.link();
   }

   free() { 
     this.to.unlink(); 
     this.to = undefined;
   }
 }

 class Referenceable {
   constructor() {
     this.count = 0;
   }

   link() { this.count++ }
   unlink() {
     if(!(--this.count)) {
       // your last words
     }
   }
 }
...