オブジェクトオブジェクト
アウトライン
JavaScriptはネイティブ提供Object
するオブジェクト(シャポーことに注意してくださいO
大文字である)を、この章では、オブジェクトのネイティブの様々な方法を説明します。
他のすべてのオブジェクトはJavaScriptのから継承されObject
たオブジェクト、それらのオブジェクトがあるObject
インスタンス。
Object
2つのカテゴリにネイティブメソッドオブジェクト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
方法を、次に生成Object
例obj
。obj
直接継承されたObject.prototype
プロパティおよびメソッドを直接使用することができobj.print
たinvoke print
メソッド。言い換えれば、obj
対象print
方法は、基本的に呼び出しているObject.prototype.print
メソッドを。
プロトタイプオブジェクトについてobject.prototype
詳細な説明、「オブジェクト指向プログラミング」を参照してください。ここではそれが定義されていることを知っているObject.prototype
以上のオブジェクトのプロパティとメソッド、オブジェクトのすべてのインスタンスで共有されることができます。
以下は、最初の説明Object
利用の関数として、その後導入Object
ネイティブオブジェクトメソッド、2つの部分の例示的な方法(また、「静的メソッド」として知られている)にオブジェクト自体。
オブジェクト()
Object
それ自体は、工具の方法、オブジェクトに任意の値として使用することができる機能です。この方法は、一般的に値がオブジェクトでなければならないことを確実にするために使用されます。
引数がヌル(またはASである場合undefined
とnull
)、Object()
NULLオブジェクトを返します。
var obj = Object();
// 等同于
var obj = Object(undefined);
var obj = Object(null);
obj instanceof Object // true
上記のコードの意味は、であるundefined
とnull
、オブジェクトにヌルオブジェクトの結果を変換します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)
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"]
上記のコードは、配列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()
例えば、対象日時のインスタンスtoString
とtoLocaleString
戻り値は同じではなく、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
プロパティが返されますtrue
。toString
プロパティは、リターンので、継承されていますfalse
。
参考リンク
- アクセルRauschmayer、JavaScriptでのオブジェクトの保護
- kangax、削除の理解
- ジョンBretman、JavaScriptで型チェック
- コーディリンドレー、ECMAScriptの5パーツを考えます
- ビョルン・ティップリング、高度なJavaScriptでのオブジェクト
- ハビエル・マルケスは、JavaScriptプロパティは、列挙書き込み可能と設定が可能です
- Rafaeliセッラ、ネイティブのJavaScriptデータバインディング:アクセス機能の実装モデルと結合双方向のビューを使用して
- リー・ベルー、オブジェクトのプロパティをコピーする、堅牢な方法