JavaScript/Object


Objectオブジェクト

編集

Objectオブジェクトは、StringNumberなど他のオブジェクトの雛形として利用される基本的なオブジェクトです。

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だけでなく、StringNumber、さらには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.groupBy()

編集
構文
Object.groupBy(obj, iteratee)

指定されたオブジェクト(または配列)を、指定した関数に基づいてグループ化します。

Object.hasOwn()

編集
構文
Object.hasOwn(obj, prop)

指定されたオブジェクトが特定のプロパティを所有しているかを確認します。

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) オブジェクト
編集

Number オブジェクトでは、valueOf() は数値のプリミティブ値を返します。

const num = new Number(42);
console.log(num.valueOf()); // 42
文字列 (String) オブジェクト
編集

String オブジェクトでは、valueOf() は文字列のプリミティブ値を返します。

const str = new String("Hello");
console.log(str.valueOf()); // "Hello"
配列 (Array)
編集

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
valueOf() の主な用途
編集
  1. 演算子での型変換 JavaScript では、+ や比較演算子を使う際に、オブジェクトがプリミティブ値に変換される場合があります。そのとき valueOf() が呼び出されます。
    const num = new Number(10);
    console.log(num + 5); // 15 (num.valueOf() が呼ばれる)
    
  2. カスタム動作 カスタムオブジェクトで特定の動作を持たせるためにオーバーライドすることがあります(例:ゲームオブジェクトのスコア計算など)。
注意点
編集
  • 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を返す。

下位階層のページ

編集

脚註

編集
  1. ^ Object.prototype.toString() - JavaScript // MDN” (2021年9月13日). 2021年11月23日閲覧。

外部リンク

編集