Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

197
Visualizações
How to access private fields from parent class in JavaScript?

I have a Heap class that has a private values field. This is good since I do not want anyone to be able to directly modify values.

class Heap {
  
  #values;
  
  constructor(array = []) {
    this.#values = array;
  }

    insert(item) {
    this.#values.push(item);
    this.#bubbleUp(this.#values.length - 1);
  }
}

But now I would like to extend my Heap class into a PriorityQueue subclass. In this class I need to change the signature of some of the methods (for example insert) so that it assigns a priority to a value. However, I cannot figure out how to access the values field from the base class. For instance, given the following PriorityQueue class:

class PriorityQueue extends Heap {
  
  constructor(array = []) {
    super(array);
  }
  
  insert(item, priority) {

    // Error: Private field '#values' must be declared in an enclosing class
    this.#values.push({ item, priority }); 
    this.#bubbleUp(this.#values.length - 1);
  }
}

I get an error when trying to push a value onto values.

Is there any way around this problem? I want to make a field private in the base class, but still accessible to the subclass.

Thanks!

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

I cannot figure out how to access the values field from the base class.

This is not possible. Private really means private in JS. Don't use it if you want the field to be accessible outside of the class.

I want to make a field private in the base class, but still accessible to the subclass.

That would be a protected member, which JS doesn't support.

Is there any way around this problem?

Well, you don't actually need to access the .#values. All you need to do is call the base class insert method:

class PriorityQueue extends Heap { 
  insert(item, priority) {
    super.insert({ item, priority });
  }
}

I would like to extend my Heap class into a PriorityQueue subclass. In this class I need to change the signature of some of the methods (for example insert) so that it assigns a priority to a value.

This is a bad idea. A subclass should not change the method signatures, otherwise it will violate the Liskov substitution principle. Instead, use composition over inheritance, where a priority queue has or contains a heap:

class PriorityQueue {
  #heap = new Heap(v => v.priority); // assuming it takes a custom comparator?
  
  push(item, priority) {
    this.#heap.insert({ item, priority });
  }
  pop() {
    return this.#heap.…
  }
}
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda