JavaScriptで開発をしていると、時折「object is not extensible」というエラーに遭遇することがあります。このエラーは、拡張不可能なオブジェクトに新しいプロパティを追加しようとした際に発生します。本記事では、このエラーの原因と解決方法について詳しく解説します。

エラーの原因

「object is not extensible」エラーは、主に以下の状況で発生します:

1. Object.preventExtensions()メソッドが適用されたオブジェクト

2. Object.seal()メソッドでシールされたオブジェクト

3. Object.freeze()メソッドで凍結されたオブジェクト

これらのメソッドは、オブジェクトの拡張を防ぐために使用されます。

解決方法

このエラーを解決するには、以下の方法を試してみてください:

1. オブジェクトの拡張可能性を確認する

まず、Object.isExtensible()メソッドを使用して、オブジェクトが拡張可能かどうかを確認します。

const obj = {};
Object.preventExtensions(obj);
console.log(Object.isExtensible(obj)); // false

2. 拡張可能なオブジェクトを作成する

新しいオブジェクトを作成し、必要なプロパティをそこにコピーします。

const originalObj = Object.freeze({name: "John"});
const newObj = {...originalObj, age: 30};
console.log(newObj); // {name: "John", age: 30}

3. Object.defineProperty()を使用する

既存のオブジェクトにプロパティを追加する必要がある場合は、Object.defineProperty()メソッドを使用します。

const obj = Object.seal({name: "Alice"});
Object.defineProperty(obj, 'age', {
  value: 25,
  writable: true,
  enumerable: true,
  configurable: false
});
console.log(obj); // {name: "Alice", age: 25}

4. Proxyを使用する

Proxyオブジェクトを使用して、オブジェクトの動作をカスタマイズすることができます。

const originalObj = Object.freeze({name: "Bob"});
const handler = {
  set: function(obj, prop, value) {
    if (!(prop in obj)) {
      Object.defineProperty(obj, prop, {
        value: value,
        writable: true,
        enumerable: true,
        configurable: true
      });
    } else {
      obj[prop] = value;
    }
    return true;
  }
};
const proxiedObj = new Proxy(originalObj, handler);
proxiedObj.age = 40;
console.log(proxiedObj.age); // 40

まとめ

「object is not extensible」エラーは、オブジェクトの拡張が制限されている場合に発生します。このエラーを解決するには、オブジェクトの拡張可能性を確認し、新しいオブジェクトを作成するか、Object.defineProperty()やProxyを使用してプロパティを追加する方法があります。これらの解決策を適切に使用することで、柔軟なオブジェクト操作が可能になり、エラーを回避できます。

JavaScriptの深い理解と、オブジェクトの不変性や拡張性に関する知識は、効率的で堅牢なコードを書く上で非常に重要です。これらの概念を適切に活用することで、より信頼性の高いアプリケーションを開発することができるでしょう。