ジャバスクリプト:オブジェクトオブジェクト

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

アウトライン

JavaScriptはネイティブ提供Objectするオブジェクト(シャポーことに注意してくださいO大文字である)を、この章では、オブジェクトのネイティブの様々な方法を説明します。

他のすべてのオブジェクトはJavaScriptのから継承されObjectたオブジェクト、それらのオブジェクトがあるObjectインスタンス。

Object2つのカテゴリにネイティブメソッドオブジェクトObjectプロセス自体及びObject例示の方法。

(1)Objectオブジェクト自体方法

いわゆる「独自の方法は、」直接定義されているObjectオブジェクトの方法。

Object.print = function (o) { console.log(o) };

上記のコードでは、print方法は直接定義されているObjectオブジェクトに。

(2)Objectメソッドの例

方法の例は、いわゆるで定義されているObjectプロトタイプオブジェクトObject.prototypeのメソッド。これは、可能なObject例として使用します。

Object.prototype.print = function () {
  console.log(this);
};

var obj = new Object();
obj.print() // Object

上記のコードは、Object.prototype定義print方法を、次に生成Objectobjobj直接継承されたObject.prototypeプロパティおよびメソッドを直接使用することができobj.printたinvoke printメソッド。言い換えれば、obj対象print方法は、基本的に呼び出しているObject.prototype.printメソッドを。

プロトタイプオブジェクトについてobject.prototype詳細な説明、「オブジェクト指向プログラミング」を参照してください。ここではそれが定義されていることを知っているObject.prototype以上のオブジェクトのプロパティとメソッド、オブジェクトのすべてのインスタンスで共有されることができます。

以下は、最初の説明Object利用の関数として、その後導入Objectネイティブオブジェクトメソッド、2つの部分の例示的な方法(また、「静的メソッド」として知られている)にオブジェクト自体。

オブジェクト()

Objectそれ自体は、工具の方法、オブジェクトに任意の値として使用することができる機能です。この方法は、一般的に値がオブジェクトでなければならないことを確実にするために使用されます。

引数がヌル(またはASである場合undefinednull)、Object()NULLオブジェクトを返します。

var obj = Object();
// 等同于
var obj = Object(undefined);
var obj = Object(null);

obj instanceof Object // true

上記のコードの意味は、であるundefinednull、オブジェクトにヌルオブジェクトの結果を変換しますobj

instanceofオペレータは、指定されたオブジェクトがインスタンスコンストラクタであるかどうかを検証するために使用されます。obj instanceof Object戻り値はtrue、それが意味objオブジェクトがあるObject場合。

パラメータは、元の型の値である場合、Objectパッケージの対応するオブジェクトのインスタンスに変換される方法(「プリミティブ型ラッパーオブジェクト」の章を参照)。

var obj = Object(1);
obj instanceof Object // true
obj instanceof Number // true

var obj = Object('foo');
obj instanceof Object // true
obj instanceof String // true

var obj = Object(true);
obj instanceof Object // true
obj instanceof Boolean // true

上記のコードでは、Object様々な機能のパラメータ値がプリミティブ型であり、オブジェクトは、ラップされた対象物に対応するプリミティブ型の値に変換されます。

場合Objectメソッドのパラメータは、オブジェクトである、それは常に変換されていないオブジェクトを返します。

var arr = [];
var obj = Object(arr); // 返回原数组
obj === arr // true

var value = {};
var obj = Object(value) // 返回原对象
obj === value // true

var fn = function () {};
var obj = Object(fn); // 返回原函数
obj === fn // true

これを使用すると、変数オブジェクトかどうかを判断するための関数を書くことができます。

function isObject(value) {
  return value === Object(value);
}

isObject([]) // true
isObject(true) // false

Objectコンストラクタ

Objectあなたも目の前に使用することができコンストラクタとして使用することができ、使用するツールとして機能するだけでなく、newコマンド。

Objectコンストラクタの主な用途は、新しいオブジェクトが、直接それを介して生成されます。

var obj = new Object();

なおvar obj = new Object()新しいオブジェクトの文言との文字通りの文言var obj = {}と同等。または、元後者は単純な文言です。

Object使用方法やツールコンストラクタメソッドはほとんど同じ、非常によく似ています。使用される場合、このパラメータが目標である場合、それは、パラメータを受け入れることができ、直接オブジェクトを返し、元の型の値場合、ラップされた対象物に対応する値は、(「オブジェクトパッケージ」の章を参照)が返されます。

var o1 = {a: 1};
var o2 = new Object(o1);
o1 === o2 // true

var obj = new Object(123);
obj instanceof Number // true

類似の使用が、しかし両者のセマンティクスは、異なる表現オブジェクトとしてターン、それは新たに作成されたオブジェクトを表し、その値はですObject(value)new Object(value)Object(value)valuenew 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"]

上記のコードは、配列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():プロパティの列挙するかどうかを判断するには。

このセクションでは、他の2つの方法の前に4つの方法は、関連するセクションで後述する説明します。

Object.prototype.valueOf()

valueOf作用の方法は、デフォルトの戻りオブジェクト自体によって、オブジェクト「値」を返すことです。

var obj = new Object();
obj.valueOf() === obj // true

上記のコードの比較obj.valueOf()obj自体が、両者は同じです。

valueOfときJavaScriptの自動型変換方法の主な目的は、(「データ型変換」の章を参照してください)このメソッドのデフォルトの呼び出しです。

var obj = new Object();
1 + obj // "1[object Object]"

上記目的コードobjデジタルの1合計が、この時間はデフォルトのJavaScriptによって呼び出されるvalueOf()得る方法obj値を、次いで1添加しました。だから、カスタムの場合はvalueOf方法、あなたは望ましい結果を得ることができます。

var obj = new Object();
obj.valueOf = function () {
  return 2;
};

1 + obj // 3

上記カスタム・コードobj、オブジェクトvalueOfメソッド、次に1 + objそれがありました3このメソッドは、カスタム使用するのと同じであるobj.valueOfカバーをObject.prototype.valueOf

Object.prototype.toString()

toStringアクションのメソッドは、文字列オブジェクト、戻り値の型文字列のデフォルト値を返すことです。

var o1 = new Object();
o1.toString() // "[object Object]"

var o2 = {a:1};
o2.toString() // "[object Object]"

上記のコードは、オブジェクト呼び出しに示すtoString方法を、文字列を返し[object Object]、オブジェクト型の文字列説明。

文字列[object Object]自体は多くの使用ではなく、カスタマイズしてtoString自動型変換がしたい文字列が得られたときにオブジェクトへの道を。

var obj = new Object();

obj.toString = function () {
  return 'hello';
};

obj + ' ' + 'world' // "hello world"

上記コードは、自動的に呼び出し、文字列オブジェクトを追加するときには使用されていることを示すtoString方法。カスタム以来toString方法、それは文字列を返しますhello world

配列、文字列、関数は、Dateオブジェクトは、カスタム展開されてtoStringカバーし、メソッドをObject.prototype.toStringメソッドを。

[1, 2, 3].toString() // "1,2,3"

'123'.toString() // "123"

(function () {
  return 123;
}).toString()
// "function () {
//   return 123;
// }"

(new Date()).toString()
// "Tue May 10 2016 09:11:31 GMT+0800 (CST)"

上記のコードでは、配列は、文字列は、関数は、Dateオブジェクトを呼び出すためのtoString方法を、と返さない[object Object]、彼らは独自の持っているので、toStringメソッドを元のメソッドを上書きし、。

toStringの応用():データタイプを分析

Object.prototype.toStringこの方法は、オブジェクト・タイプ・ストリングを返す値のタイプを決定するために使用することができます。

var obj = {};
obj.toString() // "[object Object]"

呼び出し空のオブジェクトコード上記toString方法を、結果は文字列を返しobject Object第二は、前記Objectコンストラクタの値を表しています。これは非常に有用な診断データ型です。

オブジェクトのインスタンスは、カスタムすることができるので、toString方法、上書きObject.prototype.toString方法ので、文字列型を得るために好ましいとして使用されるObject.prototype.toString方法。関数によってcall方法、あなたは、私たちは値の型を判断するために、任意の値に、このメソッドを呼び出すことができます。

Object.prototype.toString.call(value)

上記のコードはすることを示しvalue、この値呼び出しObject.prototype.toString方法。

異なるデータ型をObject.prototype.toString次のようにメソッドは、値を返します。

  • 値:リターン[object Number]
  • 文字列:リターン[object String]
  • ブール値:リターン[object Boolean]
  • 未定義:リターン[object Undefined]
  • ヌル:リターン[object Null]
  • アレイ:リターン[object Array]
  • argumentsオブジェクト:リターンを[object Arguments]
  • 機能:リターン[object Function]
  • Errorオブジェクト:リターン[object Error]
  • Dateオブジェクト:リターン[object Date]
  • RegExpオブジェクト:リターン[object RegExp]
  • 他の目的:リターン[object Object]

つまり、Object.prototype.toString我々は最後の値がどのようなタイプで見ることができます。

Object.prototype.toString.call(2) // "[object Number]"
Object.prototype.toString.call('') // "[object String]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(Math) // "[object Math]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call([]) // "[object Array]"

この機能を使用すると、上書きできるtypeofオペレータの種類のより正確な決意機能を。

var type = function (o){
  var s = Object.prototype.toString.call(o);
  return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};

type({}); // "object"
type([]); // "array"
type(5); // "number"
type(null); // "null"
type(); // "undefined"
type(/abcd/); // "regex"
type(new Date()); // "date"

上記でtype基底関数、方法は、データのいくつかの特殊なタイプが決定される追加できます。

var type = function (o){
  var s = Object.prototype.toString.call(o);
  return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};

['Null',
 'Undefined',
 'Object',
 'Array',
 'String',
 'Number',
 'Boolean',
 'Function',
 'RegExp'
].forEach(function (t) {
  type['is' + t] = function (o) {
    return type(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) // "[object Object]"
obj.toLocaleString(obj) // "[object Object]"

この方法の主な役割は、独自のバージョンを実装するオブジェクトの様々なので、脇インタフェースを設定することでtoLocaleString、特定の地域の特定の値を返すように、。

var person = {
  toString: function () {
    return 'Henry Norman Bethune';
  },
  toLocaleString: function () {
    return '白求恩';
  }
};

person.toString() // Henry Norman Bethune
person.toLocaleString() // 白求恩

上記のコードは、toString()この方法は、文字列の一般的なオブジェクトを返すtoLocaleString()メソッドは、ローカル文字列を返します。

現在、カスタマイズされた3つのオブジェクトがあるtoLocaleStringアプローチが。

  • Array.prototype.toLocaleString()
  • Number.prototype.toLocaleString()
  • Date.prototype.toLocaleString()

例えば、対象日時のインスタンスtoStringtoLocaleString戻り値は同じではなく、toLocaleString戻り値は、関連付けられたユーザによって設定された領域。

var date = new Date();
date.toString() // "Tue Jan 01 2018 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プロパティが返されますtruetoStringプロパティは、リターンので、継承されていますfalse

参考リンク

おすすめ

転載: www.cnblogs.com/wbyixx/p/12496981.html