Невозможно установить свойство ..., которое имеет только геттер (javascript es6) - PullRequest
0 голосов
/ 07 февраля 2019

Итак, у меня есть простой класс Javascript

class MyClass {
    constructor(x) {
        this.x = x === undefined ? 0 : x;
    }

    get x() {
        return this.x;
    }
}

Когда создается MyClass, я хочу, чтобы для его x было установлено значение, переданное в качестве параметра.После этого я не хочу, чтобы его можно было изменить, поэтому я намеренно не создал метод set x ().

Однако, я полагаю, мне не хватает чего-то фундаментального, так как это дает мнеошибка «Невозможно установить свойство ..., которое имеет только получатель».

Как мне присвоить значение x без создания метода установки?

Ответы [ 4 ]

0 голосов
/ 07 февраля 2019

Если вы хотите, чтобы свойство экземпляра было доступно только для чтения, сделайте его недоступным для записи:

class MyClass {
    constructor(x) {
        Object.defineProperty(this, "x", { value: x || 0 });
    }
}

Свойство может быть либо «простым» свойством, поскольку все свойства были в былые временаили свойство метода получения / установки.

Если свойство является свойством метода получения / установки, все ссылки на свойство проходят через метод получения или установки, , включая изв функции получения и установки.Таким образом, для хранения свойства вам нужно использовать альтернативное имя свойства или (лучше) экземпляр Symbol.

0 голосов
/ 07 февраля 2019

Здесь есть пара проблем.

Когда вы делаете геттер через get x(), вы заставляете this.x вызывать геттер, который будет повторяться бесконечно из-за вашего get x() выполнения this.x.

Замените ваши ссылки на this.x на this._x в этом коде следующим образом:

class MyClass {
    constructor(x) {
        this._x = x === undefined ? 0 : x;
    }

    get x() {
        return this._x;
    }
}

Теперь ваш инкапсулированный x, который теперь _x не будетзапутался для звонка получателю через this.x.

0 голосов
/ 07 февраля 2019

Если вы хотите создать неизменное свойство a в своем определении класса, это можно сделать одним из способов с помощью метода, который дает JavaScript, - это сделать (используя Object.defineProperty()).

class MyClass {
  constructor(x) {
    Object.defineProperty(this, 'a', {
      enumerable: false,
      configurable: false,
      writable: false,
      value: x || 'empty'
    });
  }

}
let o = new MyClass('Hello');

console.log(o.a);
o.a = 'Will not change';
console.log(o.a);
0 голосов
/ 07 февраля 2019
class MyClass 
{
    constructor(x) {
        this.x = x === undefined ? 0 : x;
    }

    get() {
        return this.x;
    } 

    set(x) { return this.x = x;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...