Object
クラスは JavaScript のデータ型の一つを表します。これは様々なキー付きコレクションとより複雑な実態を格納するために使用されます。Object は Object()
コンストラクターまたはオブジェクト初期化子/リテラル構文を使用して生成することができます。
解説
JavaScript のほぼすべてのオブジェクトが Object
のインスタンスです。一般的なオブジェクトは、プロパティを (メソッドを含めて) Object.prototype
から継承していますが、これらのプロパティはシャドウ化 (別名オーバーライド) されている場合があります。しかし、意図的にそうではない Object
を生成したり (例えば Object.create(null)
によって)、変更した結果そうではなくなる場合 (例えば Object.setPrototypeOf
) もあります。
Object
プロトタイプオブジェクトへの変更は、その変更の対象となるプロパティやメソッドがプロトタイプチェーンに沿ってさらにオーバーライドされない限り、プロトタイプチェーンを通してすべてのオブジェクトに表示されます。これはとても強力ですが、オブジェクトの動作をオーバーライドしたり拡張したりするのは潜在的に危険をはらむ仕組みでもあります。
Object
コンストラクターは、指定された値のオブジェクトラッパーを生成します。
- 値が
null
またはundefined
である場合、空のオブジェクトを生成して返します。 - それ以外の場合は、与えられた値に関連する型のオブジェクトを返します。
- 値がすでにオブジェクトであった場合は、その値を返します。
コンストラクター以外のコンテキストで呼び出された場合、Object
は new Object()
と同等に動作します。
オブジェクト初期化子/リテラル構文も参照してください。
オブジェクトからプロパティを削除する
オブジェクト自体には、自身のプロパティを削除するメソッドはありません ( Map.prototype.delete()
) など)。これを行うには、delete 演算子を使用する必要があります。
コンストラクター
Object()
Object
コンストラクターは指定された値のオブジェクトラッパーを生成します。
静的メソッド
Object.assign()
- 1 個以上のソースオブジェクトから、自身の列挙可能なプロパティの値をすべてターゲットオブジェクトにコピーします。
Object.create()
- 指定されたプロトタイプオブジェクトとプロパティから、新しいオブジェクトを生成します。
Object.defineProperty()
- 指定された記述子で記述された名前付きプロパティをオブジェクトへ追加します。
Object.defineProperties()
- 指定された記述子で記述された複数の名前付きプロパティをオブジェクトへ追加します。
Object.entries()
- 指定したオブジェクトの自身の列挙可能な文字列プロパティのすべての
[key, value]
ペアを含む配列を返します。 Object.freeze()
- オブジェクトを凍結します。他のコードがプロパティを削除したり変更したりすることができなくなります。
Object.fromEntries()
- 反復可能な
[key, value]
の組から新しいオブジェクトを返します。(これはObject.entries
の逆です。) Object.getOwnPropertyDescriptor()
- オブジェクトの名前付きプロパティに対応するプロパティ記述子を返します。
Object.getOwnPropertyDescriptors()
- オブジェクトの自身のすべてのプロパティの記述子を含むオブジェクトを返します。
Object.getOwnPropertyNames()
- 指定したオブジェクトの自身の列挙可能および列挙不可なすべてのプロパティの名前を、配列として返します。
Object.getOwnPropertySymbols()
- 指定したオブジェクト上に直接存在するすべてのシンボルプロパティからなる配列を返します。
Object.getPrototypeOf()
- 指定されたオブジェクトのプロトタイプ (内部の
[[Prototype]]
プロパティ) を返します。 Object.is()
- 二つの値が同じ値であるかどうかを比較します。
NaN
値はすべて同じとして扱われます (抽象的等価比較とも厳密等価比較とも異なります)。 Object.isExtensible()
- オブジェクトの拡張が許可されているかどうかを判定します。
Object.isFrozen()
- オブジェクトが凍結されているかどうかを判定します。
Object.isSealed()
- オブジェクトが封印されているかどうかを判定します。
Object.keys()
- 指定されたオブジェクト自身の列挙可能なプロパティの名前をすべて含む配列を返します。
Object.preventExtensions()
- オブジェクトに対するあらゆる拡張を禁止します。
Object.seal()
- オブジェクトを封印し、オブジェクトのプロパティの削除を禁止します。
Object.setPrototypeOf()
- プロトタイプ (内部の
[[Prototype]]
プロパティ) を設定します。 Object.values()
- 指定したオブジェクトの自身の列挙可能な文字列プロパティのすべてに対応する値を含む配列を返します。
インスタンスプロパティ
Object.prototype.constructor
- オブジェクトのプロトタイプを生成する関数を指定します。
Object.prototype.__proto__
- オブジェクトがインスタンス化されたとき、プロトタイプとして使用されたオブジェクトを指します。
Object.prototype.__noSuchMethod__
- 未定義のオブジェクトメンバーがメソッドとして呼び出された際に実行される関数を定義します。
インスタンスメソッド
Object.prototype.__defineGetter__()
- 指定したプロパティに、アクセスの際に実行されて戻り値を返す関数を関連付けます。
Object.prototype.__defineSetter__()
- 指定したプロパティに、設定の際に実行されてプロパティを変更する関数を関連付けます。
Object.prototype.__lookupGetter__()
__defineGetter__()
メソッドによって特定のプロパティに関連付けされた関数を返します。Object.prototype.__lookupSetter__()
__defineSetter__()
メソッドによって特定のプロパティに関連付けされた関数を返します。Object.prototype.hasOwnProperty()
- 指定したプロパティが、プロトタイプチェーンを通じて継承されたものではなくオブジェクトが直接持っているプロパティかどうかを示す真偽値を返します。
Object.prototype.isPrototypeOf()
- 指定したオブジェクトが、このメソッドを呼び出した元であるオブジェクトのプロトタイプチェーンにあるかどうかを示す真偽値を返します。
Object.prototype.propertyIsEnumerable()
- 内部の ECMAScript [[Enumerable]] 属性 の設定状態を示す真偽値を返します。
Object.prototype.toSource()
- このメソッドの呼び出し元オブジェクトを表すオブジェクトリテラルからなるソース文字列を返します。この値を使って新しいオブジェクトを作成できます。
Object.prototype.toLocaleString()
toString()
を呼び出します。Object.prototype.toString()
- 指定したオブジェクトを表す文字列を返します。
Object.prototype.unwatch()
- オブジェクトのプロパティから代入処理を監視するウォッチポイントを取り除きます。
Object.prototype.valueOf()
- 指定したオブジェクトのプリミティブ値を返します。
Object.prototype.watch()
- オブジェクトのプロパティに代入処理を監視するウォッチポイントを追加します。
例
undefined
と null
データ型を与えられた Object
を使用する
次の例は、o
に空の Object
オブジェクトを格納します。
let o = new Object()
let o = new Object(undefined)
let o = new Object(null)
Boolean
オブジェクトの生成に Object
を使用する
次の例は、o
に Boolean
オブジェクトを格納します。
// o = new Boolean(true) に同じ
let o = new Object(true)
// to o = new Boolean(false) に同じ
let o = new Object(Boolean())
オブジェクトのプロトタイプ
Object.prototype
の既存のメソッドの動作を変更する場合は、既存のロジックの前または後で独自の拡張を囲む形でコードを挿入するようにしてください。例えば、この (テストされていない) コードは、組込みロジックや誰かの拡張機能が実行される前に、条件付きで独自のロジックを実行します。
関数が呼び出されると、呼び出す引数は配列状「変数」 arguments に保持されます。例えば myFn(a, b, c)
の呼び出しでは、myFn の本体内での引数は (a, b, c) に対応する 3 つの配列状要素を含みます。
フックを使ってプロトタイプを変更する場合は、関数で apply()
を呼び出すことで、this
と引数 (呼び出し状態) を現在の動作に渡します。このパターンは、Node.prototype
や Function.prototype
など、どんなプロトタイプにも使えます。
var current = Object.prototype.valueOf;
// Since my property "-prop-value" is cross-cutting and isn't always
// on the same prototype chain, I want to modify Object.prototype:
Object.prototype.valueOf = function() {
if (this.hasOwnProperty('-prop-value')) {
return this['-prop-value'];
} else {
// It doesn't look like one of my objects, so let's fall back on
// the default behavior by reproducing the current behavior as best we can.
// The apply behaves like "super" in some other languages.
// Even though valueOf() doesn't take arguments, some other hook may.
return current.apply(this, arguments);
}
}
JavaScript はサブクラスオブジェクトを持っていないため、プロトタイプはオブジェクトとして機能する特定の関数の「基本クラス」オブジェクトを作成するための有用な回避策です。例えば、以下のようになります。
var Person = function(name) {
this.name = name;
this.canTalk = true;
};
Person.prototype.greet = function() {
if (this.canTalk) {
console.log('Hi, I am ' + this.name);
}
};
var Employee = function(name, title) {
Person.call(this, name);
this.title = title;
};
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee; //If you don't set Object.prototype.constructor to Employee,
//it will take prototype.constructor of Person (parent).
//To avoid that, we set the prototype.constructor to Employee (child).
Employee.prototype.greet = function() {
if (this.canTalk) {
console.log('Hi, I am ' + this.name + ', the ' + this.title);
}
};
var Customer = function(name) {
Person.call(this, name);
};
Customer.prototype = Object.create(Person.prototype);
Customer.prototype.constructor = Customer; //If you don't set Object.prototype.constructor to Customer,
//it will take prototype.constructor of Person (parent).
//To avoid that, we set the prototype.constructor to Customer (child).
var Mime = function(name) {
Person.call(this, name);
this.canTalk = false;
};
Mime.prototype = Object.create(Person.prototype);
Mime.prototype.constructor = Mime; //If you don't set Object.prototype.constructor to Mime,
//it will take prototype.constructor of Person (parent).
//To avoid that, we set the prototype.constructor to Mime (child).
var bob = new Employee('Bob', 'Builder');
var joe = new Customer('Joe');
var rg = new Employee('Red Green', 'Handyman');
var mike = new Customer('Mike');
var mime = new Mime('Mime');
bob.greet();
// Hi, I am Bob, the Builder
joe.greet();
// Hi, I am Joe
rg.greet();
// Hi, I am Red Green, the Handyman
mike.greet();
// Hi, I am Mike
mime.greet();
仕様
ブラウザーの互換性
BCD tables only load in the browser