オブジェクト オブジェクト
概要
JavaScript はネイティブで「Object」オブジェクトを提供します (最初の「O」が大文字であることに注意してください)。この章では、このオブジェクトにネイティブなさまざまなメソッドを紹介します。
JavaScript の他のすべてのオブジェクトは Object
オブジェクトから継承します。つまり、これらのオブジェクトは Object
のインスタンスです。
Object
オブジェクトのネイティブ メソッドは、Object
自体のメソッドと Object
のインスタンス メソッドの 2 つのカテゴリに分類されます。
(1) Object
オブジェクト自体のメソッド
いわゆる「独自メソッド」とは、Object
オブジェクト上に直接定義されたメソッドです。
Object.print = function (o) { console.log(o) };
上記のコードでは、print
メソッドが Object
オブジェクトに直接定義されています。
(2) Object
のインスタンスメソッド
いわゆるインスタンス メソッドは、「Object」プロトタイプ オブジェクト「Object.prototype」上で定義されたメソッドです。 Object
インスタンスによって直接使用できます。
Object.prototype.print = function () {
コンソール.ログ(これ);
};
var obj = 新しいオブジェクト();
obj.print() // オブジェクト
上記のコードでは、Object.prototype
が print
メソッドを定義し、Object
インスタンス obj
を生成します。 obj
は Object.prototype
のプロパティとメソッドを直接継承しており、obj.print
を直接使用して print
メソッドを呼び出すことができます。言い換えれば、「obj」オブジェクトの「print」メソッドは、本質的に「Object.prototype.print」メソッドを呼び出していることになります。
プロトタイプ オブジェクト object.prototype
の詳細については、「オブジェクト指向プログラミング」の章を参照してください。ここで、「Object.prototype」オブジェクトで定義されたすべてのプロパティとメソッドはすべてのインスタンス オブジェクトで共有されることを知っておいてください。
以下では、最初に Object
を関数として使用する方法を紹介し、次に Object
オブジェクトのネイティブ メソッドを紹介します。これらは 2 つの部分に分かれています: オブジェクト独自のメソッド (「静的メソッド」とも呼ばれます) とインスタンス メソッドです。 。
##物体()
「Object」自体は、任意の値をオブジェクトに変換するツールメソッドとして使用できる関数です。このメソッドは、特定の値がオブジェクトである必要があることを確認するためによく使用されます。
引数が空の場合 (または、「未定義」および「null」の場合)、「Object()」は空のオブジェクトを返します。
var obj = オブジェクト();
// と同等
var obj = オブジェクト(未定義);
var obj = オブジェクト(null);
obj オブジェクトのインスタンス // true
上記のコードの意味は、unknown
と null
をオブジェクトに変換することであり、結果は空のオブジェクト obj
になります。
instanceof
演算子は、オブジェクトが指定されたコンストラクターのインスタンスであるかどうかを確認するために使用されます。 「obj instanceof Object」は「true」を返します。これは、「obj」オブジェクトが「Object」のインスタンスであることを意味します。
パラメータがプリミティブ型の値である場合、Object
メソッドはそれを対応するラップされたオブジェクトのインスタンスに変換します (「プリミティブ型のオブジェクトのラッピング」の章を参照)。
var obj = オブジェクト(1);
obj オブジェクトのインスタンス // true
obj instanceof Number // true
var obj = Object('foo');
obj オブジェクトのインスタンス // true
objinstanceof String // true
var obj = オブジェクト(true);
obj オブジェクトのインスタンス // true
objinstanceof Boolean // true
上記のコードでは、Object
関数のパラメータはさまざまなプリミティブ型の値をオブジェクトに変換すると、そのプリミティブ型の値に対応するパッケージングオブジェクトになります。
Object
メソッドの引数がオブジェクトの場合、常にそのオブジェクトが返されます。つまり、変換は必要ありません。
var arr = [];
var obj = Object(arr) // 元の配列を返します。
obj === arr // true
変数値 = {};
var obj = Object(value) // 元のオブジェクトを返す
obj === 値 // true
var fn = function () {};
var obj = Object(fn) // 元の関数を返します。
obj === fn // true
これを利用して、変数がオブジェクトであるかどうかを判断する関数を作成できます。
関数 isObject(値) {
戻り値 === オブジェクト(値);
}
isObject([]) // true
isObject(true) // false
オブジェクトコンストラクター
Object
はツール関数としてだけでなく、コンストラクタとしても使用できます。つまり、new
コマンドが以前に使用できました。
Object
コンストラクターの主な用途は、それを介して新しいオブジェクトを直接生成することです。
var obj = 新しいオブジェクト();
var obj = new Object()
を書いて新しいオブジェクトを生成することは、リテラルのvar obj = {}
を書くことと同じであることに注意してください。言い換えれば、後者は前者を単純に書いたものにすぎません。
Object
コンストラクターの使用法はユーティリティ メソッドと非常に似ており、ほぼ同じです。使用すると、パラメータを受け入れることができます。パラメータがオブジェクトの場合は、そのオブジェクトが直接返されます。プリミティブ型の値の場合は、その値に対応するパッケージング オブジェクトが返されます (「パッケージ化オブジェクト」の章を参照)。詳細)。
var o1 = {a: 1};
var o2 = 新しいオブジェクト(o1);
o1 === o2 // true
var obj = 新しいオブジェクト(123);
obj instanceof Number // true
使い方は似ていますが、「Object(value)」と「new Object(value)」のセマンティクスは異なります。「Object(value)」は「value」をオブジェクトに変換することを意味し、「new Object(value)」はそれを意味します。新しいオブジェクトが生成され、その値が value
であることを意味します。
オブジェクトの静的メソッド
いわゆる「静的メソッド」とは、Object
オブジェクト自体にデプロイされるメソッドを指します。
Object.keys()、Object.getOwnPropertyNames()
Object.keys
メソッドと Object.getOwnPropertyNames
メソッドは両方とも、オブジェクトのプロパティを走査するために使用されます。
Object.keys
メソッドのパラメータはオブジェクトであり、配列を返します。この配列のメンバーはすべて、オブジェクト自体のプロパティ名です (継承されません)。
var obj = {
p1:123、
p2:456
};
Object.keys(obj) // ["p1", "p2"]
Object.getOwnPropertyNames
メソッドは Object.keys
と似ており、オブジェクトをパラメータとして受け取り、オブジェクト自体のすべてのプロパティ名を含む配列を返します。
var obj = {
p1:123、
p2:456
};
Object.getOwnPropertyNames(obj) // ["p1", "p2"]
一般的なオブジェクトの場合、Object.keys()
と Object.getOwnPropertyNames()
によって返される結果は同じです。列挙不可能なプロパティが関係する場合にのみ、結果が異なります。 Object.keys
メソッドは列挙可能なプロパティのみを返します (詳細については「オブジェクト プロパティの説明」の章を参照)。また、Object.getOwnPropertyNames
メソッドは列挙不可能なプロパティ名も返します。
var a = ['Hello', 'World'];
Object.keys(a) // ["0", "1"]
Object.getOwnPropertyNames(a) // ["0", "1", "長さ"]
上記のコードでは、配列の length
プロパティは列挙不可能なプロパティであるため、Object.getOwnPropertyNames
メソッドの戻り結果にのみ表示されます。
JavaScript にはオブジェクトのプロパティの数を計算するメソッドが提供されていないため、これら 2 つのメソッドを代わりに使用できます。
var obj = {
p1:123、
p2:456
};
Object.keys(obj).length // 2
Object.getOwnPropertyNames(obj).length // 2
一般に、オブジェクトのプロパティを反復するには、ほとんどの場合 Object.keys
メソッドを使用します。
他の方法
上記の 2 つのメソッドに加えて、Object
には他にも多くの静的メソッドがあります。これらについては以下で詳しく紹介します。
(1) オブジェクト属性モデルの関連メソッド
Object.getOwnPropertyDescriptor()
: プロパティの説明オブジェクトを取得します。Object.defineProperty()
: オブジェクトを記述してプロパティを定義します。Object.defineProperties()
: オブジェクトを記述して複数のプロパティを定義します。
(2) オブジェクトの状態を制御する方法
Object.preventExtensions()
: オブジェクト拡張を防止します。Object.isExtensible()
: オブジェクトが拡張可能かどうかを判断します。Object.seal()
: オブジェクト設定を無効にします。Object.isSealed()
: オブジェクトが構成可能かどうかを判断します。Object.freeze()
: オブジェクトをフリーズします。Object.isFrozen()
: オブジェクトが凍結されているかどうかを判断します。
(3) プロトタイプチェーン関連の手法
Object.create()
: このメソッドは、プロトタイプのオブジェクトとプロパティを指定し、新しいオブジェクトを返すことができます。Object.getPrototypeOf()
: オブジェクトのPrototype
オブジェクトを取得します。
オブジェクトのインスタンスメソッド
静的メソッドに加えて、「Object.prototype」オブジェクトには多くのメソッドが定義されています。これらはインスタンス メソッドと呼ばれ、Object
のすべてのインスタンス オブジェクトはこれらのメソッドを継承します。
「Object」インスタンスオブジェクトには主に6つのメソッドがあります。
Object.prototype.valueOf()
: 現在のオブジェクトに対応する値を返します。Object.prototype.toString()
: 現在のオブジェクトに対応する文字列形式を返します。Object.prototype.toLocaleString()
: 現在のオブジェクトに対応するローカル文字列形式を返します。Object.prototype.hasOwnProperty()
: プロパティが現在のオブジェクト自体のプロパティであるか、プロトタイプ オブジェクトから継承されたプロパティであるかを判断します。Object.prototype.isPrototypeOf()
: 現在のオブジェクトが別のオブジェクトのプロトタイプであるかどうかを判断します。Object.prototype.propertyIsEnumerable()
: プロパティが列挙可能かどうかを判断します。
このセクションでは最初の 4 つの方法を紹介し、他の 2 つの方法については後の関連する章で紹介します。
Object.prototype.valueOf()
valueOf
メソッドの機能はオブジェクトの「値」を返すことであり、デフォルトではオブジェクト自体を返します。
var obj = 新しいオブジェクト();
obj.valueOf() === obj // true
上記のコードは obj.valueOf()
と obj
自体を比較しますが、どちらも同じです。
valueOf
メソッドの主な目的は、JavaScript の自動型変換中にこのメソッドがデフォルトで呼び出されることです (詳細については、「データ型変換」の章を参照)。
var obj = 新しいオブジェクト();
1 + obj // "1[オブジェクト オブジェクト]"
上記のコードはオブジェクト obj
と数値 1
を追加します。このとき、JavaScript はデフォルトで valueOf()
メソッドを呼び出して obj
の値を検索し、それを 1
に追加します。したがって、valueOf
メソッドをカスタマイズすると、望ましい結果を得ることができます。
var obj = 新しいオブジェクト();
obj.valueOf = function () {
2を返します。
};
1 + オブジェクト // 3
上記のコードは、「obj」オブジェクトの「valueOf」メソッドをカスタマイズしているため、「1 + obj」は「3」になります。このメソッドは、カスタムの obj.valueOf
を使用して Object.prototype.valueOf
をオーバーライドするのと同じです。
Object.prototype.toString()
toString
メソッドの機能は、オブジェクトの文字列形式を返すことです。デフォルトでは、文字列型が返されます。
var o1 = 新しいオブジェクト();
o1.toString() // "[オブジェクト オブジェクト]"
var o2 = {a:1};
o2.toString() // "[オブジェクト オブジェクト]"
上記のコードは、オブジェクトに対して toString
メソッドを呼び出すと、オブジェクトのタイプを説明する文字列 [object Object]
が返されることを示しています。
文字列 [object Object]
自体はあまり役に立ちませんが、toString
メソッドをカスタマイズすることで、オブジェクトは自動型変換中に目的の文字列形式を取得できます。
var obj = 新しいオブジェクト();
obj.toString = function () {
「こんにちは」を返します。
};
obj + ' ' + 'world' // "ハローワールド"
上記のコードは、オブジェクトが文字列の追加に使用されるときに、toString
メソッドが自動的に呼び出されることを示しています。 toString
メソッドがカスタマイズされているため、文字列 hello world
が返されます。
配列、文字列、関数、および Date オブジェクトはすべてカスタムの toString
メソッドをデプロイし、Object.prototype.toString
メソッドをカバーします。
[1, 2, 3].toString() // "1,2,3"
'123'.toString() // "123"
(関数 () {
123 を返します。
}).toString()
// "関数 () {
// 123 を返します。
// }"
(new Date()).toString()
// "2016 年 5 月 10 日火曜日 09:11:31 GMT+0800 (CST)"
上記のコードでは、配列、文字列、関数、および Date オブジェクトが toString
メソッドを呼び出した場合、これらはすべてカスタマイズされた toString
メソッドを持ち、元のメソッドをオーバーライドするため、[object Object]
を返しません。
toString() の応用: データ型の決定
Object.prototype.toString
メソッドはオブジェクトの型文字列を返すため、値の型を決定するために使用できます。
var obj = {};
obj.toString() // "[オブジェクト オブジェクト]"
上記のコードは空のオブジェクトの toString
メソッドを呼び出し、結果は文字列 [object Object]
になります。ここで 2 番目の Object
は値のコンストラクターを表します。これは、データ型を判断するのに非常に便利な方法です。
インスタンス オブジェクトは toString
メソッドをカスタマイズし、Object.prototype.toString
メソッドをオーバーライドする可能性があるため、型文字列を取得するには、Object.prototype.toString
メソッドを直接使用するのが最善です。関数の「call」メソッドを通じて、このメソッドを任意の値に対して呼び出すことができ、値の型を決定するのに役立ちます。
Object.prototype.toString.call(value)
上記のコードは、値 value
に対して Object.prototype.toString
メソッドを呼び出すことを示しています。
各種データ型のObject.prototype.toString
メソッドの戻り値は以下の通りです。
- 数値:
[オブジェクト番号]
を返します。 - 文字列:
[オブジェクト文字列]
を返します。 - ブール値:
[オブジェクト ブール値]
を返します。 - 未定義:
[オブジェクト未定義]
を返します。 - null:
[オブジェクト Null]
を返します。 - 配列:
[オブジェクト配列]
を返します。 - 引数オブジェクト:
[オブジェクト引数]
を返します。 - 関数:
[オブジェクト関数]
を返します。 - エラーオブジェクト:
[オブジェクトエラー]
を返します。 - 日付オブジェクト:
[オブジェクト日付]
を返します。 - RegExp オブジェクト:
[オブジェクト RegExp]
を返します。 - その他のオブジェクト:
[object Object]
を返します。
これは、「Object.prototype.toString」が値の型を伝えることができることを意味します。
Object.prototype.toString.call(2) // "[オブジェクト番号]"
Object.prototype.toString.call('') // "[オブジェクト文字列]"
Object.prototype.toString.call(true) // "[オブジェクト ブール値]"
Object.prototype.toString.call(unknown) // "[オブジェクトが未定義]"
Object.prototype.toString.call(null) // "[オブジェクト Null]"
Object.prototype.toString.call(Math) // "[オブジェクト Math]"
Object.prototype.toString.call({}) // "[オブジェクト オブジェクト]"
Object.prototype.toString.call([]) // "[オブジェクト配列]"
この機能を使用すると、typeof
演算子よりも正確な型判定関数を作成できます。
var type = 関数 (o){
var s = Object.prototype.toString.call(o);
return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};
type({}); // "オブジェクト"
type([]); // 「配列」
type(5); // "数値"
type(null); // "null"
type(); // "未定義"
type(/abcd/); // "正規表現"
type(new Date()); // 「日付」
上記の「type」関数に基づいて、特定の種類のデータを具体的に判断するメソッドを追加することもできます。
var type = 関数 (o){
var s = Object.prototype.toString.call(o);
return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};
[「ヌル」、
'未定義'、
'物体'、
'配列'、
'弦'、
'番号'、
「ブール値」、
'関数'、
'正規表現'
].forEach(関数(t) {
type['is' + t] = 関数 (o) {
戻り値の型(o) === t.toLowerCase();
};
});
type.isObject({}) // true
type.isNumber(NaN) // true
type.isRegExp(/abc/) // true
Object.prototype.toLocaleString()
Object.prototype.toLocaleString
メソッドは、値の文字列形式も返す toString
と同じ結果を返します。
var obj = {};
obj.toString(obj) // "[オブジェクト オブジェクト]"
obj.toLocaleString(obj) // "[オブジェクト オブジェクト]"
このメソッドの主な機能は、さまざまなオブジェクトが独自のバージョンの「toLocaleString」を実装して、特定の地域の特定の値を返すことを可能にするインターフェースを残すことです。
var 人 = {
toString: function () {
「ヘンリー・ノーマン・ベスーン」を返します。
}、
toLocaleString: function () {
「ベスーン」を返します。
}
};
person.toString() // ヘンリー・ノーマン・ベスーン
person.toLocaleString() // ベスーン
上記のコードでは、toString()
メソッドはオブジェクトの一般的な文字列形式を返し、toLocaleString()
メソッドはローカル文字列形式を返します。
現在、「toLocaleString」メソッドをカスタマイズした主要なオブジェクトが 3 つあります。
- Array.prototype.toLocaleString()
- Number.prototype.toLocaleString()
- Date.prototype.toLocaleString()
例えば、日付インスタンスオブジェクトの「toString」と「toLocaleString」の戻り値は異なり、「toLocaleString」の戻り値はユーザーが設定した位置に関係します。
var date = 新しい Date();
date.toString() // "2018 年 1 月 1 日火曜日 12:01:33 GMT+0800 (CST)"
date.toLocaleString() // "1/01/2018、12:01:33 PM"
Object.prototype.hasOwnProperty()
Object.prototype.hasOwnProperty
メソッドはパラメータとして文字列を受け取り、インスタンス オブジェクト自体がこのプロパティを持っているかどうかを示すブール値を返します。
var obj = {
p:123
};
obj.hasOwnProperty('p') // true
obj.hasOwnProperty('toString') // false
上記のコードでは、オブジェクト obj
自体が p
属性を持っているため、true
を返します。 toString
プロパティは継承されるため、false
を返します。
参考リンク
- Axel Rauschmayer、JavaScript でのオブジェクトの保護
- kangax、[削除について](http://perfectionkills.com/ Understanding-delete/)
- Jon Bretman、JavaScript での型チェック
- Cody Lindley、[ECMAScript 5 パートについて考える](http://tech.pro/tutorial/1671/ Thinking-about-ecmascript-5-parts)
- Bjorn Tipling、JavaScript の高度なオブジェクト
- ハビエル・マルケス、JavaScript プロパティは列挙可能、書き込み可能、構成可能
- Sella Rafaeli、Native JavaScript Data-Binding: アクセス関数を使用してモデルとビュー間の双方向バインディングを実装します。
- Lea Verou、オブジェクト プロパティのコピー、堅牢な方法
作者: wangdoc
アドレス: https://wangdoc.com/
ライセンス: クリエイティブ・コモンズ 3.0