1.JavaScript Object
10798 ワード
この文章はObjectをまとめるためのすべての方法です.
JavaScriptでは、 ターゲットとソースオブジェクトが同じ属性を持つ場合、ソースオブジェクトに準じる.ソースオブジェクト間に同じ属性がある場合は、ソースオブジェクトの後ろにあるものを基準とします. コピー中にエラーが発生した場合、対象オブジェクトはそのまま維持されます. コピーした属性自体が対象であれば、浅いコピーを行い、この属性があれば、置き換えられます. コピーされた属性自体が配列である場合、属性名が0、1、2のオブジェクトとして扱われます.具体的には以下の通りです. パラメータのうち、一つが対象でないと
JavaScriptでは、
object
はすべてのオブジェクトの基礎(プロトタイプチェーンの先端)であるため、彼が持っているこれらの方法、属性は、すべてのオブジェクトが持つ方法、属性であり、具体的には方法が異なるかもしれないが(プロトタイプが上書きされ、書き換えられているので)、所属名は同じであり、内容も似たようなところがある.object
の各例は、以下の属性および方法を有する.Object .prototype
:構造関数は、現在のオブジェクトを作成するための関数を保存しています.例は以下の通りです.var obj = new Object();
console.log(obj.constructor);//function Object() { [native code] }
constructor
は何ですか?私は大体JSエンジンの内部実装コードとして認識しています.JSコードではありません.[native code]
:この方法は、入力された属性名に対応する属性が、プロトタイプチェーンによって継承されたものではなく、現在のオブジェクトが所有するものであるかどうかを確認するためのパラメータを受け入れる.もしそうならば、hasOwnProperty('propertyName')
に戻り、いいえ、true
に戻ります.例は以下の通りです.var obj = new Object();
console.log(obj.hasOwnProperty('toString'));//false
obj.toString = function(){return 123};
console.log(obj.hasOwnProperty('toString'));//true
false
:この方法は、着信されたオブジェクトのプロトタイプチェーンが現在のオブジェクトを含むかどうかを確認するためのパラメータを受け入れる.例は以下の通りです.function Foo() {}
function Bar() {}
function Baz() {}
Bar.prototype = Object.create(Foo.prototype);
Baz.prototype = Object.create(Bar.prototype);
var baz = new Baz();
console.log(Baz.prototype.isPrototypeOf(baz)); // true
console.log(Bar.prototype.isPrototypeOf(baz)); // true
console.log(Foo.prototype.isPrototypeOf(baz)); // true
console.log(Object.prototype.isPrototypeOf(baz)); // true
特に、isPrototypeOf(obj)
と間違えないようにしてください.A.isPrototypeOf(B) // A B
A instanceof B // B.prototype A
instanceof
:1つのパラメータを受け入れると、propertyIsEnumerable('propertyName')
と同様に、着信パラメータに対応する属性が列挙可能かどうかを確認するために使用される文字列パラメータのみが入力され、エニュメレーションがhasOwnProperty('propertyName')
に戻るならば、true
を循環させ、逆にダメなら、for in
に戻る.そのコードは:var obj = {};
Object.defineProperty(obj, 'prop1', {
enumerable: false,
});
Object.defineProperty(obj, 'prop2', {
enumerable: true,
});
console.log(obj.propertyIsEnumerable('prop1'));//false
console.log(obj.propertyIsEnumerable('prop2'));//true
false
:戻り対象の文字列表現であり、この文字列は領域設定に関連している.その戻り値は、オブジェクトを表す文字列です.一番多く使われているのはtoLocaleString()
です.具体的なコードは以下の通りです.var obj = {a:'1123aa'};
obj.toLocaleString();//"[object Object]"
Date.prototype.toLocaleString()
:オブジェクトを表す文字列の戻り値を返します.具体的なコードは以下の通りです.var obj = {a:'1123aa'};
obj.toString();//"[object Object]"
toString()
によって、内蔵オブジェクトがどのタイプに属するかを検出することができる.Object.prototype.toString
またはcall
を使用する必要があります.具体的なコードは以下の通りです.var toString = Object.prototype.toString;
toString.call(new Date); // [object Date]
toString.call(new String); // [object String]
toString.call(Math); // [object Math]
toString.call(undefined); // [object Undefined]
toString.call(null); // [object Null]
注目すべきは、必ず内蔵オブジェクトであり、他のオブジェクトであれば、統一的にapply
に戻ることである.[object object ]
:オブジェクトの元の値を返します.具体的なコードは以下の通りです.var obj = {a:'1123aa'};
obj.valueOf();//Object {a: "1123aa"}
なお、データタイプは変換する際には、一般的にvalueOf()
で変換され、valueOf()
で変換される.しかし、toString()
タイプのデータなら、Date
を先に使って、toString()
を使います.valueOf()
自体の方法:object
:この方法はES 6の方法であり、2つの‘個’パラメータを受け取り、最初のパラメータはターゲットオブジェクトであり、第二のパラメータは複数のパラメータであり、カンマ形式で接続された‘ソースオブジェクト’である.この方法は、列挙可能な属性の値を一つ以上のソースオブジェクトから対象オブジェクトにコピーし、対象オブジェクトに戻すためのものです.Object.assign(target,····source)
については、いくつかの注意すべき点があります.Object.assign()
は、自身の属性のみをコピーし、エニュメレーションできない属性(Object.assign()
はenumerable
)と継承された属性はコピーされない.false
もコピーされます.Object.assign([1,2,3],[4,5])//[4, 5, 3]
Symbol
エラーが発生します.その具体的なコードは以下の通りです.let obj1 = { a: 0 , b: { c: 0}};
let obj2 = Object.assign({}, obj1);
console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
obj1.a = 1;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
console.log(JSON.stringify(obj2)); // { a: 0, b: { c: 0}}
obj2.a = 2;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 0}}
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 0}}
obj2.b.c = 3;
console.log(JSON.stringify(obj1)); // { a: 1, b: { c: 3}}
console.log(JSON.stringify(obj2)); // { a: 2, b: { c: 3}}
//
obj1 = { a: 0 , b: { c: 0}};
let obj3 = JSON.parse(JSON.stringify(obj1));
obj1.a = 4;
obj1.b.c = 4;
console.log(JSON.stringify(obj3)); // { a: 0, b: { c: 0}}
TypeError
:この方法は全部で2つのパラメータがあり、最初のパラメータは必須であり、プロトタイプとして使用する対象である.Object.create(prototype,descriptors)
とすることができ、null
であれば、何の方法も引き継がれていないオブジェクトが作成され、このオブジェクトは疑似グローバル変数として、いくつかのものを保存することができる.第二のパラメータは、オプションとして、null
関数と同様の1つ以上のオブジェクトを含む.Object.defineProperty()
は具体的な使い方が多すぎて、複雑すぎて、ここでは深くしません.深く入り込むのも難しいです.単独の第一パラメータでいいです.何かを受け継ぐのに使います.二つ目のパラメータは複雑です.下のフレームの開発に関係があると思います.Object.create(prototype,descriptors)
が最初のパラメータだけを含む例については、前に書いた「JavaScript継承!話したいことがある」に行ってみてください.Object.create(prototype,descriptors)
:この方法は、オブジェクトに新しい属性を定義するか、またはオブジェクト上の既存の属性を変更し、オブジェクトに戻すためのものである.この方法は全部で3つのパラメータがあります.最初のパラメータは一つのオブジェクトを期待しています.その後の操作は全部このオブジェクトに基づいています.2番目のパラメータは、定義または変更が必要な属性名です.3番目のパラメータは、属性を定義または変更する記述子です.この方法は通常の直接定義属性とは少し違っています.下のフレームに使うのが多いです.ディスクリプタには、Object.defineProperty(obj, prop, descriptor)
、configurable
などの属性機能、挙動、値を規定する属性記述子とデータ記述子があります.下記のコード:var obj = {a : 2};
Object.getOwnPropertyDescriptor(obj,'a')//Object {value: 2, writable: true, enumerable: true, configurable: true}
enumerable
のobj
属性には4つのディスクリプタがあり、そのうちの1つはa
であり、データディスクリプタであることがわかる.他の3つは、value
(構成可能)、configurable
(列挙可能)、enumerable
(書き込み可能)である.この3つのディスクリプタを詳しく説明します.writable
:属性を変更できるかどうかを決定した値.具体的なコードは以下の通りです.var obj = {};
Object.defineProperty(obj,'a',{
value:2,
writable:false,// !
configurable:true,
enumerable:true,
})
obj.a = 3;//
console.log(obj.a)//2
あなたが見ているように、私たちはwritable
を賦課しました.この属性は3
によって書き込めないと決められました.厳密なモードでは、この値はwritable:fasle
にエラーが発生します.実は私達がTypeError
を決めた時には、空き動作writable:fasle
が設定されています.だから、setter
と一致して、writable:fasle
を呼び出したい時には、setter
のエラーを投げ出します.TypeError
:configurable
であれば、configurable:true
を使用してディスクリプタを修正することができ、コードは以下の通りである.var obj = {};
Object.defineProperty(obj,'a',{
value:2,
writable:true,
configurable:false,// !
enumerable:true,
})
obj.a = 3;
console.log(obj.a)//3
// obj
Object.defineProperty(obj,'a',{
value:2,
writable:true,
configurable:true,
enumerable:true,
})//TypeError!
したがって、Object.defineProperty(··)
は一方向で、不可逆であることが分かる.また、第一のポイントはconfigurable:false
であっても、configurable:false
をwritable:true
に変更することができますが、false
をfalse
に変更することはできません.第二の点では、true
の場合、configurable:false
の属性はa
のものではない.delete
:属性がエニュメレーション可能かどうかを決定した.言うまでもないですが、enumerable
に設定されています.false
はこの属性を巡回できません.for in
:Object.defineProperties(obj, props)
と同様の機能ですが、複数の属性を同時に定義することができます.var obj = {};
Object.defineProperties(obj, {
'a': {
value: true,
writable: true
},
'b': {
value: 'Hello',
writable: false
}
});
obj.a//true
Object.defineProperty(obj, prop, descriptor)
:オブジェクトの凍結、すなわち新しい属性の追加を阻止する方法である.既存の属性が削除されるのを防ぐ.また、既存の属性または列挙可能性を防ぐために、構成または書き換え可能な変更ができます.この方法は凍結状態のオブジェクトを返します.この方法は対象のパラメータを期待する.この方法は、現在のオブジェクトに対してObject.freeze(obj)
を呼び出し、すべての「データアクセス」属性をObject.seal()
としてマークすることに相当する.writable:false
:本方法は、実際にはオブジェクトに対してObject.seal(obj)
を呼び出し、すべての既存の属性をObject.preventExtensions(··)
としてマークするシールのオブジェクトを作成する.configurable:false
:オブジェクトの新規属性の追加を禁止し、既存の属性を保持したいなら、この方法を使用することができる.var obj = {a:2};
Object.preventExtensions(obj);
obj.b = 3;
obj.b//undefined
Object.preventExtensions(obj)
:この方法は、2つのパラメータを受け取り、1番目のパラメータは、検索属性のオブジェクトであり、2番目のオブジェクトは、属性が存在する場合は、属性記述子を返し、存在しない場合はObject.getOwnPropertyDescriptor(obj, prop)
に戻る.undefined
:この方法は、与えられたオブジェクトの属性名(エニュメレート・インライン)のすべての配列を返す.コードは以下の通りです.var obj = { 0: 'a', 1: 'b', 2: 'c' };
Object.getOwnPropertyNames(obj);//["0", "1", "2"]
Object.getOwnPropertyNames(obj)
:この方法は、所与のオブジェクトのシンボル属性名のすべての配列を返す.コードは以下の通りです.var obj = {};
var a = Symbol('a');
var b = Symbol('b');
obj[a] = 'aaa';
obj[b] = 'bbb';
Object.getOwnPropertySymbols(obj);//[Symbol(a), Symbol(b)]
Object.getOwnPropertySymbols(obj)
:この方法は、指定されたオブジェクトのプロトタイプObject.getPrototypeOf(obj)
を返す.具体的なコードは以下の通りです.var str = '123';
Object.getPrototypeOf(str)//String.prototype
prototype
この方法は2つのパラメータを受け取り、2つのパラメータが等しいかどうかを比較する.Object.is(value1,value2)
とはちょっと違っています.具体的には以下の通りです.console.log(-0 === +0)//true
console.log(Object.is(-0,+0))//false
===
は本当に待ってからtrueに戻ります.Object.is(value1,value2)
、Object.isExtensible(obj)
、Object.isFrozen(obj)
:それぞれ対象が拡張可能かどうか、凍結されているかどうか、密封されているかどうか、もしそうでないなら、Object.isSealed(obj)
に戻ります.true
は、自身のエニュメレート・属性のみを返すfalse
サイクルとして理解され得る.具体的なコードは以下の通りです.var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']