コンテンツにスキップ

JavaScript/Object/prototype

出典: フリー教科書『ウィキブックス(Wikibooks)』

Object.prototype は、JavaScript のプロトタイプチェーンの最上位に位置するオブジェクトです。すべての JavaScript オブジェクトは Object.prototype からメソッドとプロパティを継承します[1]

説明

[編集]

Object.prototype は、Object コンストラクタのプロトタイププロパティであり、すべての JavaScript オブジェクトにデフォルトで継承されるプロパティとメソッドを提供します。Object.create(null) を使用して作成されたオブジェクトを除き、すべてのオブジェクトはプロトタイプチェーンを通じて Object.prototype から継承します。

プロパティとメソッド

[編集]

プロパティ

[編集]

アクセサ

[編集]
get Object.prototype.__proto__(非推奨)

メソッド

[編集]
メソッド 解説
Object.prototype.__defineGetter__() プロパティのゲッター関数を定義します(非推奨)
Object.prototype.__defineSetter__() プロパティのセッター関数を定義します(非推奨)
Object.prototype.__lookupGetter__() プロパティのゲッター関数を取得します(非推奨)
Object.prototype.__lookupSetter__() プロパティのセッター関数を取得します(非推奨)
Object.prototype.constructor() オブジェクトのコンストラクタ関数への参照を返します
Object.prototype.hasOwnProperty() オブジェクトが指定されたプロパティを自身のプロパティとして持っているかを判定します
Object.prototype.isPrototypeOf() 指定されたオブジェクトのプロトタイプチェーンに自身が存在するかを判定します
Object.prototype.propertyIsEnumerable() 指定されたプロパティが列挙可能かどうかを判定します
Object.prototype.toLocaleString() オブジェクトを、実行環境のロケールに応じた文字列として返します
Object.prototype.toString() オブジェクトを文字列として返します
Object.prototype.valueOf() オブジェクトのプリミティブ値を返します

[編集]

Object.prototype からの継承

[編集]

以下のプログラムは、すべてのオブジェクトが Object.prototype からメソッドを継承することを示しています。

const obj = { name: 'Example Object' };
const arr = [1, 2, 3];
const func = function() {};

// すべてのオブジェクトは Object.prototype のメソッドを継承している
console.log(obj.toString()); // [object Object]
console.log(arr.toString()); // "1,2,3"
console.log(func.toString()); // "function() {}"
console.log(obj.hasOwnProperty('name')); // true

このプログラムでは、異なる型のオブジェクトがすべて Object.prototype からメソッドを継承していることを示しています。

プロトタイプチェーンの確認

[編集]

以下のプログラムは、プロトタイプチェーンを通じて Object.prototype が継承されることを確認する方法を示しています。

// カスタムオブジェクト
function CustomObject() {}
const customObj = new CustomObject();

// プロトタイプチェーンの検証
console.log(customObj.__proto__ === CustomObject.prototype); // true
console.log(CustomObject.prototype.__proto__ === Object.prototype); // true
console.log(Object.prototype.__proto__ === null); // true

// 別の方法で確認
console.log(Object.getPrototypeOf(customObj) === CustomObject.prototype); // true
console.log(Object.getPrototypeOf(CustomObject.prototype) === Object.prototype); // true
console.log(Object.getPrototypeOf(Object.prototype) === null); // true

このプログラムでは、customObjCustomObject.prototypeObject.prototypenull というプロトタイプチェーンを確認しています。

Object.prototype のメソッドのオーバーライド

[編集]

以下のプログラムは、Object.prototype のメソッドをオーバーライドする方法を示しています。

const obj = {
  name: 'Custom Object',
  // Object.prototype.toString() をオーバーライド
  toString: function() {
    return <code>[Custom Object: ${this.name}]</code>;
  }
};

console.log(obj.toString()); // "[Custom Object: Custom Object]"

// 配列の toString() は Array.prototype.toString() によってすでにオーバーライドされている
const arr = [1, 2, 3];
console.log(arr.toString()); // "1,2,3"

このプログラムでは、obj オブジェクトが toString メソッドをオーバーライドして、カスタムの文字列表現を提供しています。

hasOwnProperty の使用例

[編集]

以下のプログラムは、hasOwnProperty メソッドを使用してオブジェクト自身のプロパティと継承されたプロパティを区別する方法を示しています。

function Person(name) {
  this.name = name;
}

Person.prototype.greet = function() {
  return <code>Hello, my name is ${this.name}</code>;
};

const john = new Person('John');

// 自身のプロパティと継承されたプロパティの区別
console.log(john.hasOwnProperty('name')); // true(自身のプロパティ)
console.log(john.hasOwnProperty('greet')); // false(継承されたプロパティ)

// プロパティの列挙
for (const prop in john) {
  if (john.hasOwnProperty(prop)) {
    console.log(`Own property: ${prop}`);
  } else {
    console.log(`Inherited property: ${prop}`);
  }
}
// 出力:
// "Own property: name"
// "Inherited property: greet"

このプログラムでは、hasOwnProperty メソッドを使用して、オブジェクト自身が直接所有するプロパティと、プロトタイプから継承したプロパティを区別しています。

Object.create(null) の使用

[編集]

以下のプログラムは、Object.prototype を継承しないオブジェクトを作成する方法を示しています。

// 通常のオブジェクト
const normalObj = {};
console.log(normalObj.toString); // [Function: toString]
console.log(normalObj.__proto__ === Object.prototype); // true

// Object.prototype を継承しないオブジェクト
const nullProtoObj = Object.create(null);
console.log(nullProtoObj.toString); // undefined
console.log(nullProtoObj.__proto__); // undefined
console.log(Object.getPrototypeOf(nullProtoObj)); // null

このプログラムでは、Object.create(null) を使用して Object.prototype を継承しないオブジェクトを作成しています。このオブジェクトは toString などの標準メソッドを持ちません。

注意点

[編集]
  • プロトタイプ汚染: Object.prototype を変更すると、すべてのオブジェクトに影響するため、通常は避けるべきです。
  • プロパティの列挙: Object.prototype のプロパティは列挙可能ではないため、for...in ループでは通常表示されません。
  • 非推奨メソッド: __defineGetter____defineSetter____lookupGetter____lookupSetter____proto__ は非推奨であり、代わりに標準メソッドの使用が推奨されています。
  • for...in ループ: for...in ループはプロトタイプチェーン上の列挙可能なプロパティもすべて返すため、hasOwnProperty で自身のプロパティかどうかを確認することが重要です。
  • null オブジェクト: Object.create(null) を使用すると、Object.prototype を継承しないオブジェクトを作成できます。これは、ハッシュマップや辞書として使用する場合に便利です。
  • 非推奨のプロパティ(例: __proto__)は互換性の観点で使用を避けることが推奨されます。

JavaScript オブジェクトの prototype プロパティ

[編集]

JavaScript では、コンストラクタオブジェクトは prototype プロパティを持っています。以下は組み込みコンストラクタオブジェクトの prototype プロパティのリストです:

脚註

[編集]
  1. ^ Object.prototype は、JavaScript オブジェクト階層のルートとなるプロトタイプオブジェクトであり、すべてのオブジェクトの共通機能を提供します。

外部リンク

[編集]