Не удается получить доступ к закрытому полю через общедоступный доступ через прокси

#javascript #vue.js #vuex

Вопрос:

При получении данных из модуля VueX через Геттер объект оборачивается прокси-сервером, который выдает следующую ошибку:

Ошибка типа: попытка получить закрытое поле в не-экземпляре

при попытке прочитать частную собственность с помощью публичного получателя.

 class Example {
  #privateField;

  get privateField() {
    return this.#privateField;
  }
}
 
 computed(){
  getInfoForSpecificItem() {
    const arrayOfInstantiatedExamples = this.$store.getters['getArrayOfInstantiatedExamples'];
    for (let i = 0; i < arrayOfInstantiatedExamples.length; i  = 1) {
      // trying to access it in this condition throws the error since the Object
      // has been wrapped with a Proxy coming from Vue (I guess)
      if (arrayOfInstantiatedExamples[i].privateField === 'something') {
        // does something
      }
    }
  }
}
 

Почему я не могу прочитать свойство и как я могу создать экземпляр из целевого прокси-сервера.
регистрация прокси-объекта показывает, что у цели есть вся информация, но попытка прочитать ее через геттер не работает.

Есть ли какие-либо другие варианты, кроме как сделать поля общедоступными?

Комментарии:

1. Это не то, как классы и методы выполняются в Javascript.

2. @Хакинет, но, похоже, это так . Что ты имеешь в виду?

3. То, за чем вы следуете, — это всего лишь прототип метода получения. Дело не в том, как это делается. Попробуйте эту ссылку, она все прояснит: javascript.info/class

4. Вместо того, чтобы делать его частным, возможно, вам следует объявить его защищенным. Проверьте, что это должно быть полезной ссылкой

Ответ №1:

Вы определяете а class не а function . Так что уберите скобки () .

 class Example {
 

Вы не можете определить переменную с # помощью . Только $ и _ разрешено использовать в переменной. Так что замените # на $ вот так $privateField;

Классы-это чертежи, а не допустимый объект. Сначала создайте объект из этого класса.

 const proxyWrappedExample = new Example;
 

После того, как вы зарегистрируете это, вы сможете избежать ошибки, но она регистрируется undefined .

Ваш код должен выглядеть так

 class Example {
  $privateField = 'something';

  get privateField() {
    return this.$privateField;
  }
}

const proxyWrappedExample = new Example;

// I receive the Object (which has been instantiated earlier) wrapped in a proxy Object. 
// Trying to access the property throws the error.
// e.g.:

console.log(proxyWrappedExample.privateField); // 'something'
 

$privateField без какой-либо ценности будет выглядеть следующим образом.

 class Example {
  $privateField;

  get privateField() {
    return this.$privateField;
  }
}

const proxyWrappedExample = new Example;

// I receive the Object (which has been instantiated earlier) wrapped in a proxy Object. 
// Trying to access the property throws the error.
// e.g.:

console.log(proxyWrappedExample.privateField); // 'undefined'
 

Комментарии:

1. скобки были опечаткой, я отредактировал их. Я думаю, вы не поняли моего вопроса. У меня есть экземпляр объекта класса Пример, но он обернут прокси-сервером. Без упаковки я могу получить к нему доступ без проблем, но как только прокси-сервер вступает в игру, я получаю сообщение об ошибке.

2. Проблема с объявлением $privateField; в теле класса заключается в том, что оно не является «частным» . Это / это становится общедоступным свойством любого Example экземпляра. Синтаксис операции был выбран намеренно, так как код операции использует поля частного класса .