ES5のオブジェクト保護とアクセサプロパティ

厳格モード ("use strict")

ES5ではスクリプトや関数内で"use strict"を宣言することで、コードをより厳格な文法で実行する「ストリクトモード」が導入されました。これにより、以下のような制約が追加されます:

  • 未宣言の変数への代入がエラーになる
  • 静黙失敗(エラーが発生しない失敗)が明示的な例外に変わる
  • 通常の関数内のthiswindowではなくundefinedを参照する
  • arguments.calleeの使用が禁止される

例:ストリクトモード下での関数

"use strict";
function example() {
  console.log(this); // undefined
}
example();

オブジェクトの保護

JavaScriptではオブジェクトのプロパティが自由に変更・削除できるため、不正な値が代入されたり、意図しない構造変更が行われたりするリスクがあります。ES5では、オブジェクトやプロパティの保護を行うためのメソッドが提供されています。

プロパティの保護

特定のプロパティに対して、書き込み・列挙・構造変更を制限することができます。

  • writable:書き込み可否
  • enumerable:for...inループなどで列挙可能かどうか
  • configurable:プロパティの設定変更や削除の可否

例:Object.defineProperty()

var user = {
  name: "Alice",
  age: 25
};

Object.defineProperty(user, "name", {
  writable: false,
  configurable: false
});

Object.defineProperty(user, "age", {
  configurable: false
});

Object.defineProperty(user, "secret", {
  value: "秘密",
  enumerable: false,
  configurable: false
});

console.log(user);
user.name = "Bob"; // 変更されない
delete user.age; // 削除されない
console.log(user.secret); // アクセスは可能

複数プロパティの一括設定

一度に複数のプロパティを設定するにはObject.defineProperties()を使用します。

var user = {
  name: "Alice",
  age: 25
};

Object.defineProperties(user, {
  name: {
    writable: false,
    configurable: false
  },
  age: {
    configurable: false
  }
});

アクセサプロパティ (getter/setter)

プロパティのアクセスや代入にカスタムロジックを挟むために、アクセサプロパティ(getter/setter)を使用します。これは内部プロパティを保護するために有効です。

例:年齢の範囲制限付きプロパティ

var person = {
  _age: 20
};

Object.defineProperty(person, "age", {
  get: function() {
    return this._age;
  },
  set: function(value) {
    if (value >= 18 && value <= 65) {
      this._age = value;
    } else {
      throw new Error("年齢は18〜65の範囲で指定してください");
    }
  },
  enumerable: true,
  configurable: false
});

console.log(person.age); // 20
person.age = 30;
console.log(person.age); // 30
person.age = 10; // エラー

タグ: javascript ES5 Object.defineProperty getter setter

5月28日 03:09 投稿