メッセージ
TypeError: can't define property "x": "obj" is not extensible (Firefox) TypeError: Cannot define property: "x", object is not extensible. (Chrome)
エラータイプ
何がうまくいかなかったのか?
通常、オブジェクトは拡張可能で、新しいプロパティを追加できます。しかしこの場合は、Object.preventExtensions()
がオブジェクトをもはや拡張できないものに設定しているため、拡張不可のマークが付けられたときにあったプロパティ以上のプロパティを追加できません。
例
strict モードでは、拡張不可のオブジェクトに新しいプロパティを追加しようとすると TypeError
をスローします。非 strict モードでは、"x" プロパティの追加は暗黙的に無視されます。
'use strict';
var obj = {};
Object.preventExtensions(obj);
obj.x = 'foo';
// TypeError: can't define property "x": "obj" is not extensible
strict モードと非 strict モード共に、拡張不可のオブジェクトに新しいプロパティを追加しようとして Object.defineProperty()
を呼び出すと、例外をスローします。
var obj = { };
Object.preventExtensions(obj);
Object.defineProperty(obj,
'x', { value: "foo" }
);
// TypeError: can't define property "x": "obj" is not extensible
このエラーを修正するには、Object.preventExtensions()
の呼び出しを削除するか、オブジェクトが拡張不可とマークされる前にプロパティを追加するように移動する必要があります。もちろん、必要がないのであれば、追加しようとしているプロパティを削除しても良いです。
'use strict';
var obj = {};
obj.x = 'foo'; // add property first and only then prevent extensions
Object.preventExtensions(obj);