#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
экземпляра. Синтаксис операции был выбран намеренно, так как код операции использует поля частного класса .