JavaScript/Object/prototype
Object.prototype
は、JavaScript のプロトタイプチェーンの最上位に位置するオブジェクトです。すべての JavaScript オブジェクトは Object.prototype
からメソッドとプロパティを継承します[1]。
説明
[編集]Object.prototype
は、Object
コンストラクタのプロトタイププロパティであり、すべての JavaScript オブジェクトにデフォルトで継承されるプロパティとメソッドを提供します。Object.create(null)
を使用して作成されたオブジェクトを除き、すべてのオブジェクトはプロトタイプチェーンを通じて Object.prototype
から継承します。
プロパティとメソッド
[編集]プロパティ
[編集]アクセサ
[編集]メソッド
[編集]メソッド | 解説 |
---|---|
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
からメソッドを継承することを示しています。
constobj={name:'Example Object'};constarr=[1,2,3];constfunc=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
が継承されることを確認する方法を示しています。
// カスタムオブジェクトfunctionCustomObject(){}constcustomObj=newCustomObject();// プロトタイプチェーンの検証console.log(customObj.__proto__===CustomObject.prototype);// trueconsole.log(CustomObject.prototype.__proto__===Object.prototype);// trueconsole.log(Object.prototype.__proto__===null);// true// 別の方法で確認console.log(Object.getPrototypeOf(customObj)===CustomObject.prototype);// trueconsole.log(Object.getPrototypeOf(CustomObject.prototype)===Object.prototype);// trueconsole.log(Object.getPrototypeOf(Object.prototype)===null);// true
このプログラムでは、customObj
→ CustomObject.prototype
→ Object.prototype
→ null
というプロトタイプチェーンを確認しています。
Object.prototype のメソッドのオーバーライド
[編集]以下のプログラムは、Object.prototype
のメソッドをオーバーライドする方法を示しています。
constobj={name:'Custom Object',// Object.prototype.toString() をオーバーライドtoString:function(){return<code>[CustomObject:${this.name}]</code>;}};console.log(obj.toString());// "[Custom Object: Custom Object]"// 配列の toString() は Array.prototype.toString() によってすでにオーバーライドされているconstarr=[1,2,3];console.log(arr.toString());// "1,2,3"
このプログラムでは、obj
オブジェクトが toString
メソッドをオーバーライドして、カスタムの文字列表現を提供しています。
hasOwnProperty の使用例
[編集]以下のプログラムは、hasOwnProperty
メソッドを使用してオブジェクト自身のプロパティと継承されたプロパティを区別する方法を示しています。
functionPerson(name){this.name=name;}Person.prototype.greet=function(){return<code>Hello,mynameis${this.name}</code>;};constjohn=newPerson('John');// 自身のプロパティと継承されたプロパティの区別console.log(john.hasOwnProperty('name'));// true(自身のプロパティ)console.log(john.hasOwnProperty('greet'));// false(継承されたプロパティ)// プロパティの列挙for(constpropinjohn){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
を継承しないオブジェクトを作成する方法を示しています。
// 通常のオブジェクトconstnormalObj={};console.log(normalObj.toString);// [Function: toString]console.log(normalObj.__proto__===Object.prototype);// true// Object.prototype を継承しないオブジェクトconstnullProtoObj=Object.create(null);console.log(nullProtoObj.toString);// undefinedconsole.log(nullProtoObj.__proto__);// undefinedconsole.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
プロパティのリストです:
AggregateError.prototype
:AggregateError
プロトタイプへの参照Array.prototype
:Array
プロトタイプへの参照ArrayBuffer.prototype
:ArrayBuffer
プロトタイプへの参照BigInt.prototype
:BigInt
プロトタイプへの参照BigInt64Array.prototype
:BigInt64Array
プロトタイプへの参照BigUint64Array.prototype
:BigUint64Array
プロトタイプへの参照Boolean.prototype
:Boolean
プロトタイプへの参照DataView.prototype
:DataView
プロトタイプへの参照Date.prototype
:Date
プロトタイプへの参照Error.prototype
:Error
プロトタイプへの参照EvalError.prototype
:EvalError
プロトタイプへの参照FinalizationRegistry.prototype
:FinalizationRegistry
プロトタイプへの参照Float16Array.prototype
:Float16Array
プロトタイプへの参照Float32Array.prototype
:Float32Array
プロトタイプへの参照Float64Array.prototype
:Float64Array
プロトタイプへの参照Function.prototype
:Function
プロトタイプへの参照Int8Array.prototype
:Int8Array
プロトタイプへの参照Int16Array.prototype
:Int16Array
プロトタイプへの参照Int32Array.prototype
:Int32Array
プロトタイプへの参照Iterator.prototype
:Iterator
プロトタイプへの参照Map.prototype
:Map
プロトタイプへの参照Number.prototype
:Number
プロトタイプへの参照Object.prototype
:Object
プロトタイプへの参照Promise.prototype
:Promise
プロトタイプへの参照Proxy.prototype
:Proxy
プロトタイプへの参照RangeError.prototype
:RangeError
プロトタイプへの参照ReferenceError.prototype
:ReferenceError
プロトタイプへの参照RegExp.prototype
:RegExp
プロトタイプへの参照Set.prototype
:Set
プロトタイプへの参照SharedArrayBuffer.prototype
:SharedArrayBuffer
プロトタイプへの参照String.prototype
:String
プロトタイプへの参照Symbol.prototype
:Symbol
プロトタイプへの参照SyntaxError.prototype
:SyntaxError
プロトタイプへの参照TypeError.prototype
:TypeError
プロトタイプへの参照Uint8Array.prototype
:Uint8Array
プロトタイプへの参照Uint8ClampedArray.prototype
:Uint8ClampedArray
プロトタイプへの参照Uint16Array.prototype
:Uint16Array
プロトタイプへの参照Uint32Array.prototype
:Uint32Array
プロトタイプへの参照URIError.prototype
:URIError
プロトタイプへの参照WeakMap.prototype
:WeakMap
プロトタイプへの参照WeakRef.prototype
:WeakRef
プロトタイプへの参照WeakSet.prototype
:WeakSet
プロトタイプへの参照
脚註
[編集]- ^
Object.prototype
は、JavaScript オブジェクト階層のルートとなるプロトタイプオブジェクトであり、すべてのオブジェクトの共通機能を提供します。