オブジェクト オブジェクト

概要

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.prototypeprint メソッドを定義し、Object インスタンス obj を生成します。 objObject.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

上記のコードの意味は、unknownnull をオブジェクトに変換することであり、結果は空のオブジェクト 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:123p2:456
};

Object.keys(obj) // ["p1", "p2"]

Object.getOwnPropertyNames メソッドは Object.keys と似ており、オブジェクトをパラメータとして受け取り、オブジェクト自体のすべてのプロパティ名を含む配列を返します。

var obj = {
  p1:123p2: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:123p2: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 を返します。

参考リンク


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0