この記事は編集レビューを必要としています。ぜひご協力ください。
メッセージ
TypeError: "x" is read-only (Firefox) TypeError: 0 is read-only (Firefox) TypeError: Cannot assign to read only property 'x' of #<Object> (Chrome) TypeError: Cannot assign to read only property '0' of [object Array] (Chrome)
エラータイプ
何がうまくいかなかったのか?
値を割り当てようとしたグローバル変数、またはオブジェクトのプロパティが読み取り専用プロパティです。(技術的には、 non-writable データプロパティ です。)
このエラーは、strict モードコード のときにだけ発生します。strict コードではない場合、割り当ては無視されるだけです。
例
無効なケース
読み取り専用プロパティはさほど一般的ではありませんが、 Object.defineProperty()
、または Object.freeze()
を使用して生成できます。
"use strict"; var obj = Object.freeze({name: "Elsa", score: 157}); obj.score = 0; // TypeError "use strict"; Object.defineProperty(this, "LUNG_COUNT", {value: 2, writable: false}); LUNG_COUNT = 3; // TypeError "use strict"; var frozenArray = Object.freeze([0, 1, 2]); frozenArray[0]++; // TypeError
JavaScript のビルトインにも、いくつか読み取り専用プロパティがあります。 Math の定数を再定義しようとしたとします。
"use strict"; Math.PI = 4; // TypeError
残念ながらできません。
グローバル変数の undefined
も読み取り専用のため、このようにすると悪名高い "undefined is not a function" エラーが発生します:
"use strict"; undefined = function () {}; // TypeError: "undefined" is read-only
有効なケース
"use strict"; var obj = Object.freeze({name: "Score", points: 157}); obj = {name: obj.name, points: 0}; // 新しいオブジェクトで置き換える "use strict"; var LUNG_COUNT = 2; // `var` が使われているので、読み取り専用ではない LUNG_COUNT = 3; // ok (解剖学的にはおかしいけれども)