JavaScriptオブジェクトを理解するために、オブジェクト作成、プロパティ操作、およびオブジェクトメソッドから開始できます。要約すると、次のモジュールが含まれます。
1.オブジェクトを作成します
1.1直接オブジェクト測定
オブジェクトの直接的な量は、オブジェクトを作成する最も簡単な方法であり、いくつかの名前/値ペアで構成されています。
var point = {x:0、y:0};属性名に制限はありません。それらはJSキーワードまたは任意の文字列にすることができます。これらの2つの状況の場合、属性は二重引用符で囲む必要があります。
var empty = {}; va point = {x:0、y:0}; var book = {"main title": "javascript"、 "sub-title": "the definitive Guide"、 "for": "for All Audiess"、{firstName: "Davide"、lastName: "Flanagan"}};オブジェクトを直接作成するのは非常に簡単ですが、通常はこの方法では使用されません。コードは再利用可能です。他の場所でオブジェクトを使用したい場合、属性値が異なる場合は、これを行いますか?別のコードを再作成する必要がありますか?
1.2 newを介してオブジェクトを作成します
新規を介してオブジェクトを作成する前に、最初に関数を作成する必要があり、新しい機能をコンストラクターとして扱います。たとえば、newを介して人オブジェクトを作成します。
function person(){// constructor} var person = new Person();JavaScript言語のコアのプリミティブタイプには、すべて内蔵コンストラクターが含まれています。
var a = new array(); var d = new date(); var r = new regexp( "js");
1.3 object.create()
オブジェクトの作成方法を理解する前に、プロトタイプとは何かを確認したいと思います。各JavaScriptオブジェクト(nullを除く)は、別のオブジェクトに関連付けられています。 「別の」オブジェクトは、プロトタイプと呼ばれるものです。各オブジェクトは、プロトタイプから属性を継承します。
オブジェクトの直接数量を介して作成されたすべてのオブジェクトには、同じプロトタイプObject.Prototypeが同じです。キーワードnewおよびconstructorによって作成されたオブジェクトプロトタイプは、コンストラクターのプロトタイププロパティの値です。 new array()を介して作成されたオブジェクトのプロトタイプはarray.prototypeであり、new date()を介して作成されたオブジェクトのプロトタイプはdate.prototypeです。プロトタイプはここで紹介されています。
Object.Createメソッドには、2つのパラメーターが含まれています。最初のパラメーターはオブジェクトのプロトタイプであり、2番目のパラメーターはオブジェクトのプロパティを記述するためにオプションです。使いやすく、必要なプロトタイプオブジェクトを渡すだけです。
var o1 = object.create({x:1、y:2}); //プロトタイプはobject.prototypeですプロトタイプなしでオブジェクトを作成する場合は、パラメーターとしてnullを渡すことができます。この方法で作成されたオブジェクトは、プロパティを継承せず、ToStringのような方法はありません。
var o2 = object.create(null); //プロトタイプなし
通常の空のオブジェクトを作成する場合は、それを直接object.prototypeに渡します。
var o3 = object.create(object.prototype);
カスタムオブジェクトの場合、空のオブジェクトを作成することと同じです。オブジェクト名を直接渡す。プロトタイプ:
function person(){} var o4 = object.create(person.prototype);2。属性管理
2.1プロパティクエリと設定
オブジェクトのプロパティは、ドット(。)または四角いブラケット([])演算子を介して取得できます。ドットを使用して属性を取得する場合、属性名は単純なインジケーターでなければなりません。 O.forやO.Classなど、予約された単語にはなりません。
ar著者= book.author; //正しいvar name = auther.surname; //正しいvar title = book ["main title"]; //正しいvar classname = book.class; //エラー
オブジェクト["プロパティ"]の構文は、この配列の要素が数字ではなく文字列でインデックス化されていることを除いて、アレイのように見えます。この種の配列は、ハッシュ、マップ、または辞書としても知られる連想配列と呼ばれるものです。 JavaScriptオブジェクトは連想配列です。
オブジェクトは連想配列であるため、JavaScriptは、プロパティをトラバースする方法も提供します。次の例では、ポートフォリオの合計値を計算するために/inを使用します。
function getValue(ポートフォリオ){var total = 0.0; for(ポルトリオの在庫){var shares = portolio [stock]; var price = getquote(stock);合計 +=株 *価格。 } totalを返します;}継承:JavaScriptオブジェクトには独自のプロパティがあり、一部のプロパティはプロトタイプオブジェクトから継承されます。まず、継承を実装する関数継承を見てみましょう。
function enternit(p){if(p == null)throw typeRror(); // pはオブジェクトであり、if(object.create){return object.create(p); // object.createメソッドを直接使用} var t = typeof p; if(t!== "object" && t!== "function")throw typeRror();関数f(){}; f.prototype = p; //プロトタイプ属性をPに設定して、新しいf();}を返します。オブジェクトoの属性xを照会すると仮定します。 Oにxが存在しない場合、Oのプロトタイプオブジェクトの属性xを照会し続けます。プロトタイプオブジェクトにxがないが、プロトタイプオブジェクトにもプロトタイプがある場合は、xが見つかるまでプロトタイプオブジェクトのプロトタイプのクエリを実行し続けます。
var o = {}; // object.prototypeからのoinheritオブジェクト属性ox = 1; // o var p = enternit(o)のx属性を定義します。 // pinherit oおよびobject.prototypep.y = 2; // pdefine属性yvar q = enternit(p); // Qinherit P、OおよびObject.Prototypeq.Z = 3; //属性zvar s = q.toString()を定義します。 // toStringはobject.prototypeq.x + qy // => 3:xとyをそれぞれOとPから継承します2.2属性を削除します
削除演算子は、オブジェクトのプロパティを削除できます。
book.author; delete book ["main title"];
削除は独自の属性のみを削除することができ、継承された属性を削除することはできません。継承されたプロパティを削除するには、プロパティを定義するプロトタイプオブジェクトから削除する必要があります。これは、プロトタイプから継承されたすべてのオブジェクトに影響します。削除はtrueを返します。
ar o = {x:1}; delete ox; // xを削除し、truedelete oxを返します。 // xは存在しなくなり、何も行われず、trueを返します。 o.tostringを削除します。 //何もしない、真実を返してください。削除は、構成可能なタイプのfalseで属性を削除できません。いくつかの組み込みオブジェクトのプロパティは、変数宣言と関数宣言を介して作成されたグローバルオブジェクトのプロパティなど、構成できません。オブジェクトを削除することは削除できません。 //このプロパティを削除することはできませんfunction f(){} this.fを削除します。 //グローバル関数を削除することはできません2.3プロパティを検出します
プロパティがオブジェクトに存在するかどうかを判断するために、in operator、hasownproperty()、およびpropertyisenumerable()メソッドによって検出できます。
オペレーターでは、オペレーターは左側のプロパティ名と右側のオブジェクトです。オブジェクトの属性または継承された属性が属性が含まれている場合、trueを返します。
var o = {x:1}; "x" in o; // true:xはoの属性「y」です。 // false:yはoの属性「toString」ではありません。 // true:o tostring属性を継承しますhasownProperty()メソッド:指定された名前がオブジェクトのプロパティであるかどうかを検出します。継承された属性の場合、それはfalseを返します:
var o = {x:1}; o.hasownproperty( "x"); // true:oは無料のプロパティを持っていますxo.hasownproperty( "y"); // false:財産なしyo.hasoenproperty( "toString"); // false:Tostringは相続財産ですPropetitisEnumerable()メソッド:hasownpropertyの拡張バージョンです。それは、独自のプロパティが検出され、このプロパティが真実であると保持されている場合にのみTRUEを返します。
var o = ensulit({y:2}); ox = 1; o.propertyisenumerable( "x"); // true:oは列挙可能なプロパティを持っていますxo.propertyisenumerable( "y"); // false:yは継承されたobject.prototype.propertyisenumerable( "toString");です。 // false:列挙できません2.4列挙プロパティ
通常、/inはオブジェクトプロパティをループするために使用され、トラバースされたプロパティには独自のプロパティと継承されたプロパティが含まれます。オブジェクト継承の組み込み方法は列挙できませんが、コード内のオブジェクトに追加されたプロパティは列挙可能です。例えば:
var o = {x:1、y:2、z:3}; // 3つの列挙可能なプロパティo.propertyisenumable( "toString"); // false、(o in o)の場合は列挙できません//プロパティコンソール.log(p);転送; //出力x、y、z、toString出力なし時々、私たちは自分のプロパティを反復したいだけで、プロパティは関数ではありません。
for(p in o){if(!o.hasownproperty(p))継続; if(typeof o [p] === "function")継続;}列挙性トラバーサル関数を介して列挙可能な属性をコピーできます。
/** Pの列挙性属性をOにコピーしてO*を返し、O*とPが同じ名前の属性を含む場合、o*の属性を上書きします。 // o} return o;}に属性を追加します
ES5は、属性名を列挙する2つの関数を定義します。 1つ目はObject.keys()です。これは、オブジェクト内の列挙可能な属性名で構成される配列を返します。 2番目の列挙関数はobject.getownPropertyNames()です。これは、列挙性のプロパティだけでなく、オブジェクトのすべてのプロパティをすべて返すObject.keys()に似ています。
3。属性カプセル化
3.1属性ゲッターとセッター
オブジェクト属性は、名前、値、属性のセットで構成されています。 ES5では、属性値は、ゲッターとセッターである1つまたは2つの方法に置き換えることができます。ゲッターとセッターによって定義される属性は、「アクセサア属性」と呼ばれます。 「データ属性」とは異なり、データ属性の単純な値は1つだけです。
データ属性とは異なり、アクセサア属性は書き込みできません。プロパティにゲッターメソッドとセッターメソッドの両方がある場合、それは読み取り/書き込みプロパティです。 Getterメソッドのみがある場合、それは読み取り専用のプロパティであり、セッターメソッドのみがある場合、それは書き込みのみのプロパティです。書き込みのみの属性を読むことは常に未定義です。
Accessor属性定義の構文も比較的単純です。関数定義は関数キーワードを使用しませんが、getまたはsetを使用します。
var o = {//通常のデータ属性data_prop:1、// accessor属性はすべてペアワイズ定義関数です。2Dデカルトポイントの座標を表す次のオブジェクトについて考えてください。それぞれ2つの通常の特性xとyがx座標とy座標を表します。また、ポイントの極座標を表すために、2つの同等のアクセター特性もあります。
var p = {// xとyは通常の読み取りwriteデータ属性x:1.0、y:1.0、// rは読み取りwriteアクセサア属性です。 }、set r(newValue){var oldvalue = math.sqrt(this.x * this.x + this.y * this); var比= newValue / oldValue; this.x *=比率; this.y *=比率; }、// thetaは読み取り専用アクセサ属性であり、getterメソッドのみがget theta(){return math.atan2(this.y、this.x); }};データ属性と同様に、アクセサア属性は継承可能であるため、上記のコードのPオブジェクトは、別の「ポイント」のプロトタイプと見なすことができます。性的オブジェクトのxおよびyプロパティを定義できますが、Rとシータのプロパティは次のとおりです。
var q = enternit(p); qx = 1、qy = 1; console.log(qr); cosole.log(q.theta);
3.2属性機能
Accessor属性のGetterおよびSetterメソッドを属性特性と見なすことができます。このロジックによれば、プロパティのプロパティの特性も見ることができます。したがって、プロパティには名前と4つの属性が含まれていると考えることができます。
数値プロパティの4つの特性は、その価値、書き込み可能、列挙可能で、構成可能です。
アクセター属性には値の特性とライター性がないため、読み取り(get)、書き込み(セット)、列挙、および構成可能性が含まれます。
ES5は、これらの4つの属性を表す「属性記述子」という名前のオブジェクトを定義します。データ属性の記述子オブジェクトの属性には、値、書き込み、列挙可能、構成可能なものが含まれます。 Accessor属性の記述オブジェクトは、GET属性とSET属性に置き換えられます。その中でも、書き込み可能で、列挙可能で、構成可能なのはブール値であり、GET属性とセット属性は関数値です。
Object.getownPropertyDescriptor()を呼び出すことにより、オブジェクトの特定のプロパティのプロパティ記述子を取得できます。
// return {value:1、writable:true、enumerable:true、configureable:true} object.getownProeprtyDescriptor({x:1}、 "x"); //上記のランダムオブジェクトのオクテットプロパティをクエリしてください// return {get:/ *func */、set:emurable:true:true、 true} object.getownPropertyDesciptor(ランダム、 "Octet"); //継承された属性および存在しない属性については、undefinedObject.getownPropertyDesciptor({}、 ""); objeg.getownPropertyDesciptor({}、 ");関数名からわかるように、object.getownPropertyDesciptor()は、独自のプロパティの記述者のみを取得できます。継承された属性の特性を取得するには、プロトタイプチェーン(object.getPrototypeof())を通過する必要があります。
プロパティのプロパティを設定する場合、または新しく作成されたプロパティが特定のプロパティを持つようにする場合は、Object.defineProperty()を呼び出す必要があります。
//プロパティは存在しますが、牛を列挙することはできません。 // => 1Object.keys(o)// => [] //プロパティxを変更してObject.defineProperty(o、 "x"、{writable:true}); //このプロパティの値を変更します。 //操作に失敗しますが、エラーは報告されておらず、タイプエラーの例外が厳密なモードでスローされます//プロパティはまだ構成可能であるため、Object.defineProperty(o、 "x"、{value:2}); ox // = 2 //今すぐデータプロパティからxを返すx " 0;}}); ox // => 0複数のプロパティを同時に変更または作成する場合は、object.defineProperties()を使用する必要があります。最初のパラメーターは変更するオブジェクトで、2番目のパラメーターはマッピングテーブルです。例えば:
var p = object.defineProperties({}、{x:{value:1、writable:true、列挙:true、configurable:true}、y:{value:2、writable:true、列挙:true、configurable:true}、r:{get:function(){return ath.列挙可能:true、configurable:true}});ゲッターとセッター向けの昔ながらのAPI: ES5の前に、ほとんどのJavaScriptの実装は、Object Direct数量の構文で取得および設定を既にサポートできます。これらの実装は、クエリと設定のゲッターとセッターのための標準以外の昔ながらのAPIを提供します。これらのAPIは4つの方法で構成されており、すべてのオブジェクトにはこれらのメソッドがあります。
__LookUpgetter __()および__ lookupsetter __()は、名前付き属性ゲッターおよびセッターメソッドを返すために使用されます。
__definegetter __()および__definesetter __()は、ゲッターとセッターを定義するために使用されます。最初のパラメーターは属性名で、2番目のパラメーターはゲッターとセッターメソッドです。
var o = {}; o .__定義__( "x"、function(){return 0;}); o .__ definesetter __( "y"、function(value){console.log( "set value:" + value);});4.オブジェクトの3つのプロパティ
各オブジェクトには、それに関連するプロトタイプ、クラス、および拡張可能な属性があります。次に、これらの属性が何をするかについて話しましょう。
4.1プロトタイププロパティ
オブジェクトのプロトタイプ属性は、属性を継承するために使用されます。多くの場合、「Oのプロトタイプ」を「Oのプロトタイプ」と直接呼び出します。以前は、「オブジェクトの作成」は、オブジェクトを作成する3つの方法を導入しました。オブジェクトによって作成されたオブジェクトは、object.prototypeを使用してプロトタイプとして使用されます。新しいによって作成されたオブジェクトは、コンストラクターのプロトタイプ属性をプロトタイプとして使用します。 object.create()で作成されたオブジェクトは、最初のパラメーターをプロトタイプとして使用します。
ES5では、オブジェクトのプロトタイプは、object.getPrototypeof()を介して照会できます。 ES3では、同等の関数はありませんが、代わりにo.constructor.prototype式を使用してオブジェクトのプロトタイプを確認します。
オブジェクトが別のオブジェクトのプロトタイプであるか(またはプロトタイプチェーンにある)かどうかを検出するには、ISPrototypeof()メソッドを使用します。たとえば、pがp.isprototypeof(o)によるOのプロトタイプであるかどうかを検出できます。
var p = {x:1}; //プロトタイプオブジェクトを定義するvar o = object.create(p); //このプロトタイプを使用して、オブジェクトを作成しますp.isprototypeof(o); // => true、oはpobject.prototype.isprototypeof(o)// => trueから継承します、pはobject.prototypeから継承しますMozillaによって実装されたJavaScriptは、オブジェクトのプロトタイプを直接照会/設定するために、__Proto__という名前の属性を公開します。ただし、IEとOperaは__Proto__属性をサポートしていないため、__Proto__属性を直接使用することはお勧めしません。
4.2クラスの属性
オブジェクトのクラス属性は、オブジェクトのタイプ情報を表す文字列です。 ES3とES5の両方がこのプロパティを設定する方法を提供し、それを照会する間接的な方法は1つだけです。デフォルトのtoString()メソッドは、この形式で文字列を返します:[オブジェクトクラス]。
toString()メソッドを呼び出してから、8番目と返された文字列の最後から2番目の位置の間に文字を抽出できます。しかし、多くのオブジェクトがtoString()メソッドを継承したことが書き直されたという問題があります。正しいtoString()バージョンを呼び出すことができるようにするには、function.call()メソッドを間接的に呼び出す必要があります。次の例のclassof関数は、任意のオブジェクトのクラスを返すことができます。
function classof(o){if(o === null)return "null"; if(o === undefined) "undefined"を返します。 return object.prototype.tostring.call(o).slice(8、-1);}4.3スケーラビリティ
オブジェクトの拡張性は、新しいプロパティをオブジェクトに追加できるかどうかを示すために使用されます。すべての内蔵オブジェクトとカスタムオブジェクトは明示的に拡張可能です。 ES5では、オブジェクトは非スケーラブルに変換できます。
オブジェクトを非拡張不可に設定することに加えて、object.seal()メソッドは、すべてのオブジェクトのプロパティを完全に構成できないように設定することもできます。つまり、新しい属性をオブジェクトに追加することはできず、既存の属性を削除して構成することはできません。
Object.issealed()メソッドは、オブジェクトが囲まれているかどうかを検出するために使用されます。
object.freeze()メソッドは、オブジェクトをより厳密にロックします。 object.seal()メソッドの関数に加えて、すべての独自のデータ属性を読み取り専用に設定することもできます(オブジェクトのアクセサア属性にセッターメソッドがある場合、アクセサア属性は影響を受けません。
Object.isfrozen()は、オブジェクトが凍結されているかどうかを検出するために使用されます。
5。オブジェクトをシリアル化します
オブジェクトのシリアル化とは、オブジェクトの状態を文字列に変換することを指します。または、文字列をオブジェクトに復元できます。 ES5は、JavaScriptオブジェクトをシリアル化および復元するために、組み込み関数json.stringify()およびjson.parse()を提供します。これらのメソッドはすべて、JSONをデータ交換形式として使用します。例えば:
o = {x:1、y:{z:[false、null、 ""]}}; //テストオブジェクトを定義しますs = json.stringify(o); // {"x":1、 "y":{"z":[false、null ""]}} p = json.parse(s); // pはoのディープコピーですJSONの構文はJavaScriptの構文のサブセットであり、JavaScriptのすべての値を表すことはできません。オブジェクト、配列、文字列、無限の数字、真、false、およびnullがサポートされており、シリアル化および復元できます。 Nan、Infinity、および-infinity Serializationの結果はすべてnullです。関数、Regexp、エラーオブジェクト、および未定義の値をシリアル化して復元することはできません。
ここでは、オブジェクトのメソッドを追加します。
toString()メソッド:このメソッドを呼び出すオブジェクトの値を表す文字列を返します。多くのオブジェクトは、array.toString()、date.toString()、function.toString()などのtoString()メソッドを書き直しました。
tojson()メソッド: object.prototypeは実際にtojson()メソッドを定義しませんが、シリアル化を実行する必要があるため、json.stringify()メソッドはtojson()メソッドを呼び出します。この方法がシリアル化されたオブジェクトに存在する場合、呼び出されます。
valueof()メソッド: valueof()メソッドはtoString()メソッドと非常に似ていますが、JavaScriptは、特に数値に変換される場合、文字列ではなく特定の元の値にオブジェクトを変換する場合に呼び出すことがよくあります。いくつかの組み込みクラスは、date.valueof()などのvalueof()メソッドをカスタマイズします。
上記の記事は、JavaScriptオブジェクトの進歩が私があなたと共有するすべてのコンテンツの進歩を包括的に理解しています。私はそれがあなたに参照を与えることができることを願っています、そしてあなたがwulin.comをもっとサポートできることを願っています。