Невозможно назначить свойство, которое имеет только геттер в суперклассе - PullRequest
2 голосов
/ 17 мая 2019

Сегодня к моему полному удивлению я обнаружил, что следующие ошибки кода:

class Base {
  get foo() { return 42 }
}

class Derived extends Base {
  constructor() {
    super()
    console.log(this, Object.getOwnPropertyDescriptor(this, 'foo'))
    this.foo = 52
  }
}

new Derived()

Вот вывод:

Derived {} undefined
/Users/andy/clarity/src/server/temp.js:14
    this.foo = 52;
             ^

TypeError: Cannot set property foo of #<Base> which has only a getter
    at new Derived (/Users/andy/clarity/src/server/temp.js:11:5)

Где указано это поведение и как виртуальная машина обеспечивает его выполнение?

Я бы подумал, что присвоение запрещено только для собственного только для чтения объекта, но в этом случае виртуальная машина, похоже, проверяет цепочку прототипов.

Чтобы добавить к моей путанице, следующее назначение не является ошибкой, но не имеет никакого эффекта:

const base = {
  get foo() {return 42}
}

const derived = Object.create(base)
derived.foo = 58

console.log(derived.foo) // outputs 42???

Очевидно, что при назначении свойства происходит гораздо больше, чем я думал.Я думаю, что люди правы, что я должен прочитать спецификацию 101

...