JavaScript/Object
Objectオブジェクト
[編集]Object
オブジェクトは、String
やNumber
など他のオブジェクトの雛形として利用される基本的なオブジェクトです。
JavaScriptでは、ほぼすべてのデータ型がObject
型を継承しています。
Objectの型
[編集]以下のコードで、Object
や他の組み込みオブジェクトの型について確認できます。
console.log(`Objectの型 typeof Object => ${typeof Object} typeof String => ${typeof String} typeof Number => ${typeof Number} typeof Function => ${typeof Function} Object === Object.prototype.constructor => ${Object === Object.prototype.constructor} String === String.prototype.constructor => ${String === String.prototype.constructor} Number === Number.prototype.constructor => ${Number === Number.prototype.constructor} Function === Function.prototype.constructor => ${Function === Function.prototype.constructor} `)
実行結果
[編集]上記のコードを実行すると、以下の結果が得られます:
Objectの型 typeof Object => function typeof String => function typeof Number => function typeof Function => function Object === Object.prototype.constructor => true String === String.prototype.constructor => true Number === Number.prototype.constructor => true Function === Function.prototype.constructor => true
解説
[編集]Object
の型はfunction
です。これは、Object
だけでなく、String
やNumber
、さらにはFunction
も同様に型がfunction
であることを示しています。- このことから、これらは関数であり、それぞれが自身のオブジェクトを生成するためのコンストラクタ(constructor)であることがわかります。
静的プロパティ
[編集]Object.length
[編集]コンストラクターとしてのパラメーター数。
- 値
- 1
- 型
number
Object.name
[編集]型名。
- 値
- "Object"
- 型
string
Object.prototype
[編集]一般的なオブジェクトは、Object.prototype
からプロパティ(メソッドを含む)を継承しますが、これらのプロパティはシャドウイング(別名オーバーライド)されることがあります。
しかし、Object.create(null)のように意図的に継承されていないオブジェクトを作成したり、Object.setPrototypeOf
のように継承されていないオブジェクトを変更することもできます。
静的メソッド
[編集]Object.assign()
[編集]- 構文
Object.assign(target, ...sources)
ターゲットオブジェクトにソースオブジェクトのすべての列挙可能なプロパティをコピーします。
Object.create()
[編集]- 構文
Object.create(proto[, propertiesObject])
指定されたプロトタイプオブジェクトを持つ新しいオブジェクトを作成します。
Object.defineProperties()
[編集]- 構文
Object.defineProperties(object, descriptors)
オブジェクトに複数のプロパティを定義します。詳細は以下の例を参照してください。
- 使用例
Object.defineProperties(Array.prototype, { first: { get: function() { return this[0]; }, set: function(e) { return this[0] = e; }, }, last: { get: function() { return this[this.length - 1]; }, set: function(e) { return this[this.length - 1] = e; }, }, }); const ary = [3, 1, 4]; console.log(ary.first); // => 3 ary.first = 10; console.log(ary.first); // => 10
Object.defineProperty()
[編集]- 構文
Object.defineProperty(object, property, descriptor)
オブジェクトに1つのプロパティを定義または変更します。
Object.entries()
[編集]- 構文
Object.entries(obj)
オブジェクトのすべての列挙可能なプロパティを [key, value]
ペアの配列として返します。
Object.freeze()
[編集]- 構文
Object.freeze(obj)
オブジェクトを凍結し、変更を防止します。
Object.fromEntries()
[編集]- 構文
Object.fromEntries(iterable)
キーと値のペアのリストからオブジェクトを生成します。
Object.getOwnPropertyDescriptor()
[編集]- 構文
Object.getOwnPropertyDescriptor(obj, prop)
指定されたオブジェクトのプロパティ記述子を返します。
Object.getOwnPropertyDescriptors()
[編集]- 構文
Object.getOwnPropertyDescriptors(obj)
オブジェクトのすべてのプロパティ記述子を返します。
Object.getOwnPropertyNames()
[編集]- 構文
Object.getOwnPropertyNames(obj)
指定されたオブジェクトのすべてのプロパティ名(非列挙型を含む)を配列として返します。
Object.getOwnPropertySymbols()
[編集]- 構文
Object.getOwnPropertySymbols(obj)
指定されたオブジェクトのすべてのシンボルプロパティを配列として返します。
Object.getPrototypeOf()
[編集]- 構文
Object.getPrototypeOf(obj)
指定されたオブジェクトのプロトタイプを返します。
Object.is()
[編集]- 構文
Object.is(value1, value2)
2つの値が厳密に等しいかを比較します。
Object.isExtensible()
[編集]- 構文
Object.isExtensible(obj)
オブジェクトが拡張可能かを判定します。
Object.isFrozen()
[編集]- 構文
Object.isFrozen(obj)
オブジェクトが凍結されているかを判定します。
Object.isSealed()
[編集]- 構文
Object.isSealed(obj)
オブジェクトがシールされている(追加や削除ができない状態か)を判定します。
Object.keys()
[編集]- 構文
Object.keys(obj)
オブジェクトの列挙可能なプロパティ名を配列として返します。
Object.preventExtensions()
[編集]- 構文
Object.preventExtensions(obj)
オブジェクトの拡張を禁止します。
Object.seal()
[編集]- 構文
Object.seal(obj)
オブジェクトをシールし、プロパティの追加や削除を防ぎます。
Object.setPrototypeOf()
[編集]- 構文
Object.setPrototypeOf(obj, prototype)
指定されたオブジェクトのプロトタイプを設定します。
Object.values()
[編集]- 構文
Object.values(obj)
オブジェクトの列挙可能な値を配列として返します。
インスタンスメソッド
[編集]Object.prototype.__defineGetter__()
[編集]- 構文
obj.__defineGetter__(prop, func)
オブジェクトの指定されたプロパティにゲッタ関数を定義します。非推奨とされており、Object.defineProperty()
の使用が推奨されます。
Object.prototype.__defineSetter__()
[編集]- 構文
obj.__defineSetter__(prop, func)
オブジェクトの指定されたプロパティにセッタ関数を定義します。非推奨とされており、Object.defineProperty()
の使用が推奨されます。
Object.prototype.__lookupGetter__()
[編集]- 構文
obj.__lookupGetter__(prop)
指定されたプロパティに関連付けられたゲッタ関数を取得します。非推奨とされており、新しいコードでは使用を避けるべきです。
Object.prototype.__lookupSetter__()
[編集]- 構文
obj.__lookupSetter__(prop)
指定されたプロパティに関連付けられたセッタ関数を取得します。非推奨とされており、新しいコードでは使用を避けるべきです。
Object.prototype.constructor
[編集]- 構文
obj.constructor
オブジェクトを構築した関数を返します。オブジェクトのプロトタイプチェーンを確認する際に役立ちます。
Object.prototype.hasOwnProperty()
[編集]- 構文
obj.hasOwnProperty(prop)
オブジェクトが指定されたプロパティを直接所有しているかどうかを判定します。
Object.prototype.isPrototypeOf()
[編集]- 構文
obj.isPrototypeOf(object)
指定されたオブジェクトが、自身のプロトタイプチェーンに含まれているかどうかを判定します。
Object.prototype.propertyIsEnumerable()
[編集]- 構文
obj.propertyIsEnumerable(prop)
オブジェクトの指定されたプロパティが列挙可能かどうかを判定します。
Object.prototype.toLocaleString()
[編集]- 構文
obj.toLocaleString()
オブジェクトをロケールに依存した文字列表現に変換します。通常はtoString()
メソッドを呼び出しますが、ロケール固有の動作を実装することも可能です。
Object.prototype.toString()
[編集]- 構文
obj.toString()
オブジェクトを文字列表現に変換します。通常は[object Type]
の形式で返されます。
toString()メソッドは、オブジェクトを表す文字列を返します[1]。
すべてのオブジェクトは toString() メソッドを持っています。このメソッドは、オブジェクトがテキスト値として表現される場合や、文字列が期待される方法でオブジェクトが参照される場合に、自動的に呼び出されます。デフォルトでは、toString()メソッドは、Objectの子孫であるすべてのオブジェクトに継承されます。カスタム・オブジェクトでこのメソッドがオーバーライドされていない場合、toString() は "[object type]" を返し、type はオブジェクト・タイプです。以下のコードで説明します。
Object.prototype.valueOf()
[編集]- 構文
obj.valueOf()
オブジェクトのプリミティブ値を返します。算術演算子や文字列連結に使用される場合、valueOf()
が優先的に呼び出されます。
Object.prototype.valueOf()
は、JavaScript におけるすべてのオブジェクトが継承するメソッドで、オブジェクトのプリミティブな値を返すために使用されます。
ただし、Object.prototype.valueOf()
は、ほとんどの組み込みオブジェクトでオーバーライドされているか、カスタマイズされて使用されるため、その挙動はオブジェクトの種類によって異なります。
基本的な動作
[編集]デフォルトでは、valueOf()
はオブジェクト自身を返します(プリミティブな値ではなく、参照としてのオブジェクトを返します)。
const obj = { a: 1 }; console.log(obj.valueOf()); // { a: 1 } console.log(obj.valueOf() === obj); // true
この動作は、Object
のデフォルト実装によるものです。
異なるオブジェクトでの動作
[編集]Number
オブジェクトでは、valueOf()
は数値のプリミティブ値を返します。
const num = new Number(42); console.log(num.valueOf()); // 42
String
オブジェクトでは、valueOf()
は文字列のプリミティブ値を返します。
const str = new String("Hello"); console.log(str.valueOf()); // "Hello"
Array
オブジェクトでは、valueOf()
はオブジェクトそのものを返します。
const arr = [1, 2, 3]; console.log(arr.valueOf()); // [1, 2, 3] console.log(arr.valueOf() === arr); // true
カスタムオブジェクト
[編集]独自のオブジェクトで valueOf()
をオーバーライドすることができます。
class Custom { constructor(value) { this.value = value; } valueOf() { return this.value; } } const customObj = new Custom(100); console.log(customObj.valueOf()); // 100
- 演算子での型変換 JavaScript では、
+
や比較演算子を使う際に、オブジェクトがプリミティブ値に変換される場合があります。そのときvalueOf()
が呼び出されます。const num = new Number(10); console.log(num + 5); // 15 (num.valueOf() が呼ばれる)
- カスタム動作 カスタムオブジェクトで特定の動作を持たせるためにオーバーライドすることがあります(例:ゲームオブジェクトのスコア計算など)。
注意点
[編集]Object.prototype.valueOf()
は通常のオブジェクトでは滅多に直接使用されません。- プリミティブ値を返すのか、オブジェクトそのものを返すのかはオブジェクトの種類に依存します。
- 独自のクラスやオブジェクトでオーバーライドする場合、慎重に設計する必要があります。
まとめ
[編集]Object.prototype.valueOf()
は、オブジェクトのプリミティブ値を取得するためのメソッドであり、デフォルトではオブジェクトそのものを返します。ただし、特定のビルトインオブジェクトやカスタムオブジェクトで挙動を変えることができます。
Object.prototype.toLocaleString()
[編集]基本的にtoStringと全く同じ動作を行う。 このメソッドは、ArrayやNumber、Date型のオブジェクトがtoLocaleStringを持っているのに対し、他のオブジェクトはこれを持っていないため、他の型でtoLocaleStringが呼び出される場合でもエラー出してプログラムの実行が止まらないための雛形として用意されています。 他のデータ型でtoLocaleStringを使うべき問題にあたった場合にそれぞれのデータ型でメソッドを定義してやればよい。
Object.prototype.hasOwnProperty(V)
[編集]オブジェクトが引数で渡したプロパティを自前で持っているかをチェックする。持っていない場合、および他のクラスから継承している場合はfalseを返す。
for~in文は通常、オブジェクトにプロパティやメソッドを追加したときにその違いが出る。 例えば次の様なオブジェクトを作成したとする。
Object.prototype.getBMI = function(){ return this[体重] / this[身長] ** 2 } const girl ={ 身長: 158, 体重: 49 }; for (const p in girl) console.log(p, ' : ', girl[p]); /* 身長 : 158 体重 : 49 getBMI : ƒ (){ return this[体重] / this[身長] ** 2 } */
この様にすると結果として、「身長」、「体重」の他に「getBMI」のメソッドの中身も表示されてしまう。 それを禁止するために、親オブジェクトから取得したデータを無視するため次の様に記述する。
for (const p in girl) if (girl.hasOwnProperty(p)) console.log(p, ' : ', girl[p]);
ちなみに、親オブジェクトも含めてそのプロパティを持っているかどうかを調べるにはin演算子を使用する。
if (p in girl) { /* ... */ }
Object.prototype.valueOf()
[編集]データの値をそのまま返す。 このメソッドは他のオブジェクトでそれぞれオーバーライドされるのを期待されて存在しています。 そのため、単体としてそれほどの意味は無い。 プリミティブ型のラッパーオブジェクトから元のプリミティブを得る時に使われる。
Object.prototype.isPrototypeOf(V)
[編集]引数で与えたオブジェクトが、自分の子孫ノードであるかどうかをチェックする。
function Foo(){} function Bar(){} function Baz(){} Bar.prototype = new Foo(); Baz.prototype = new Bar(); console.log(Foo.prototype.isPrototypeOf(new Bar())); // true console.log(Foo.prototype.isPrototypeOf(new Baz())); // true
Object.prototype.propertyIsEnumerable(V)
[編集]引数で指定したプロパティがオブジェクト自身のプロパティかつ、for~in文で列挙可能なものであるのかをチェックする。 プロパティでなければfalseを、列挙可能ならtrueを、不可能ならfalseを返す。
下位階層のページ
[編集]脚註
[編集]- ^ “Object.prototype.toString() - JavaScript // MDN” (2021年9月13日). 2021年11月23日閲覧。