Object.defineProperty иногда выбрасывает

Я играю с классами ES6 и недоступными для записи свойствами. В качестве примера у меня есть следующий код. Я запускаю его под версией узла v9.9.0.

  Crash = class Crash {
    constructor() {
      Object.defineProperty(this, 'test', {
        enumerable: true,
        value: 100
      });
    }

    setTest(val) {
      this.test = val;
    }

  };

  c = new Crash;
  c.test = 10;    // happens silently
  console.log(c); // displays Crash { test: 100 }
                  // so it didn't change
  c.setTest(20);  // Throws a typeError
  
  // TypeError: Cannot assign to read only property 'test' of object '#<Crash>'

Таким образом, кажется, что если свойство экземпляра, доступное только для чтения, установлено вне экземпляра, присвоение игнорируется; если установлено внутри экземпляра, это TypeError.

Это ожидаемое поведение? Я не могу найти это нигде документировано.


person Cliff Stanford    schedule 26.03.2018    source источник


Ответы (2)


Это ожидаемое поведение? нигде не могу найти это документально

Да, в нестрогом режиме

Прочтите это: Изменение свойства

В строгом режиме будет выброшена ошибка:

'use strict'; // <------- Strict mode

class Crash {
  constructor() {
    Object.defineProperty(this, 'test', {
      enumerable: true,
      value: 100
    });
  }

  setTest(val) {
    this.test = val;
  }
};

var c = new Crash;
c.test = 10; // happens silently

person Ele    schedule 26.03.2018

Разница в том, что ваш метод class находится в строгом режиме, а остальная часть вашего кода неявно неаккуратна. Пытаться

(function() {
  "use strict";
  const c = new Crash;
//^^^^^ needs declaration for not failing here alredy
  c.test = 10;    // Throws a TypeError as expected
  console.log(c);
}());
person Bergi    schedule 26.03.2018