1. ホーム
  2. javascript

[解決済み] Uncaught TypeError: 読み取り専用プロパティに割り当てられない

2022-02-06 08:36:06

質問

Nicholas Zakasによる素晴らしい本「Professional JavaScript for Web Developers"」から、この本当に簡単な例を試していたのですが、ここで何が間違っているのかがわかりません。何かとても簡単なことを見逃しているに違いないのですが、行き詰っています。

以下はそのコードです。

'use strict';

var book = {};

Object.defineProperties(book, {
    originYear: {
        value: 2004,
        writable: false
    },

    _year: {
        value: 2004
    },

    edition: {
        value: 1
    },

    year : {
        get: function() {
            return this._year;
        },

        set: function(newValue) {
            if(newValue > this.originYear) {
                this._year = newValue;
                this.edition += newValue - this.originYear;
            }
        }
    }
});

console.log(book.edition);
book.year = 2006;
console.log(book.edition);

Chromeのコンソールで出ているエラーは。

Uncaught TypeError: の読み取り専用プロパティ '_year' に代入できません。 #main.js:31 Object.defineProperties.year.setmain.js:39 (匿名関数)

どなたか、どこで間違ったのか説明していただけませんか?

以下は フィドル

解決方法は?

を使用する場合 Object.defineProperties は、デフォルトで writable が設定されます。 false ということで _yearedition は、実際には 読み取り専用 のプロパティを使用します。

に明示的に設定します。 writable: true :

_year: {
    value: 2004,
    writable: true
},

edition: {
    value: 1,
    writable: true
},

チェックアウト この方法については、MDN .

writable
true そのプロパティに関連付けられた値が代入演算子で変更できる場合のみ。
デフォルトは false .