オブジェクトとは:
人間の認識の観点からは、オブジェクトは次のいずれかである必要があります:
1. 触れたり、見たりできるもの、
2. 人間の知性によって理解できるもの、
3. 思考や行動を導くことができるもの (想像すること)または印象的なアクション)のもの。
JavaScript オブジェクトの特徴:
どのプログラミング言語を使用する場合でも、まずオブジェクトの本質的な特性を理解する必要があります。
要約すると、オブジェクトに
は次の特徴があります。
オブジェクトには状態があります: オブジェクトには状態があり、同じオブジェクトが異なる状態にある場合があります。
オブジェクトには動作があります。つまり、オブジェクトの状態は、その動作によって変化する可能性があります。
一意に識別可能:
一般的に言えば、さまざまな言語でのオブジェクトの一意の識別はメモリアドレスによって具現化されており、オブジェクトには一意の識別メモリアドレスがあるため、一意の識別があります。
状態と動作:
オブジェクトの 2 番目と 3 番目の特性である「状態と動作
」については、次のように、言語ごとに異なる用語を使用して抽象的に記述します。それらは、C++ では「メンバー変数」および「メンバー関数」と呼ばれます。
Java はそれらを「プロパティ」および「メソッド」と呼びます。
JavaScript では、状態と動作は「プロパティ」として統合され、抽象化されます。
次のコードは、
o はオブジェクトであり、JavaScript にとって d と f は 2 つの通常のプロパティです。書き方が違うだけです。
var o = { d: 1, f() { console.log(this.d); } };
JavaScript のオブジェクトのユニークな機能は、オブジェクトが非常に動的であることです。これは、JavaScript を使用すると、ユーザーが実行時にオブジェクトに状態と動作を追加できるためです。たとえば、JavaScript では、実行時にプロパティをオブジェクトに追加できます。
JavaScript オブジェクトのプロパティには、データ プロパティとアクセサ プロパティ (getter/setter)の 2 種類があります。
データ属性:
データ属性には 4 つの特徴があります。
value : 属性の値です。
writable : 属性を割り当てることができるかどうかを決定します。
enumerable : in がプロパティを列挙できるかどうかを決定します。
configurable : 属性を削除できるかどうか、または特性値を変更できるかどうかを決定します。ほとんどの場合、データ属性の値のみを気にします。
アクセサー (ゲッター/セッター) プロパティ:
また、4つの特徴があります。
getter : 関数または undefined で、プロパティ値を取得するときに呼び出されます。
setter : 関数または未定義で、プロパティ値を設定するときに呼び出されます。
enumerable : in がプロパティを列挙できるかどうかを決定します。
configurable : 属性を削除できるかどうか、または特性値を変更できるかどうかを決定します。アクセサー プロパティにより、読み書き時にプロパティがコードを実行できるようになります。これにより、ユーザーは、プロパティの書き込み時と読み取り時に、まったく異なる値を取得できます。これは、関数の構文糖衣と見なすことができます。
通常、属性を定義するために使用されるコードは、書き込み可能、列挙可能、および構成可能なすべてのデフォルトがtrueである data attributes を生成します。組み込み関数Object.getOwnPropertyDescripterを使用して、以下を確認できます。
var o = { a: 1 }; o.b = 2; //a 和 b 皆为数据属性 Object.getOwnPropertyDescriptor(o,"a") // {value: 1, writable: true, enumerable: true, configurable: true} Object.getOwnPropertyDescriptor(o,"b") // {value: 2, writable: true, enumerable: true, configurable: true}
ここでは、2 つの構文を使用して属性を定義します.この方法で定義された属性は、すべて書き込み可能、
列挙可能、および構成可能なデータ属性であることがわかります. デフォルト値は true.
プロパティの特性を変更する場合、またはアクセサ プロパティを定義する場合は、 Object.definePropertyを使用できます。例は次のとおりです。
(Object.defineProperty メソッドを理解していない場合は、最初に私のメモObject.defineProperty を読むと、よく理解できます)
var o = { a: 1 }; Object.defineProperty(o, "b", {value: 2, writable: false, enumerable: false, configurable: false}) //a 和 b 都是数据属性,但特征值变化了 Object.getOwnPropertyDescriptor(o,"a"); // {value: 2, writable: true, enumerable: true, configurable: true} Object.getOwnPropertyDescriptor(o,"b"); // {value: 2, writable: false, enumerable: false, configurable: false} o.b = 3; console.log(o.b); // 2
書き込み可能な機能が false であるため、b を再割り当てしますが、b の値は変更されません。
オブジェクトを作成するときに、get キーワードと setキーワードを使用してアクセサー プロパティを作成することもできます。コードは次のとおりです。
var o = { get a() { return 1 } }; console.log(o.a); // 1
アクセサー プロパティは、プロパティにアクセスするたびにゲッター関数またはセッター関数が実行されるという点で、データ プロパティとは異なります。ここで
ゲッター関数は 1 を返すので、oa は毎回 1 を取得します。
実は JavaScript オブジェクトの実行時は「属性の集まり」であり、属性は文字列やシンボルをキーとし、データ属性の特性値やアクセサ属性の特性値を値として使用します。
オブジェクトは属性のインデックス構造です(インデックス構造は一般的なデータ構造であり、キーを使用して比較的高速に値を見つけることができる辞書として理解できます)。
上記のオブジェクト o を例に取りましょう。次のことが想像できます。
“a” はキーです。
{writable:true,value:1,configurable:true,enumerable:true} は値です。
Symbol をプロパティ名として使えるのは JavaScript オブジェクトの特徴です。
JavaScript の非常に動的なオブジェクト システムにより、ほとんどのオブジェクト指向プログラミング パラダイムをエミュレートできるため、JavaScript はオブジェクト指向言語です。