JSオブジェクトの属性タイプ、属性定義、属性読み込み


オブジェクトを理解する
ES 5のオブジェクトは、無秩序な属性のセットを意味します.(属性は基本値、オブジェクト、関数とすることができます.)
オブジェクトの属性タイプは2種類あります.一つはデータ属性で、データ値の保存位置です.もう一つはアクセス属性で、getterとsetter関数が含まれています.
1.1データ属性
データ属性はデータ値の位置を含み、この位置で値を読み取り、書き込みすることができます.データ属性には4つの特性が記述されている.(これらの特性はjavascript内部エンジンサービスのためで、直接アクセスできないので、括弧に入れます.)
  • [[Configrable]]:プロパティをdeleteで削除することで属性を再定義することができるか、属性の特性を変更することができるか、またはアクセス属性に属性を変更することができるかを示します.デフォルトはtrueです
  • [[Enumerable]:for-i nループで属性を返すことができますか?デフォルトはtrueです
  • [[Writable]]:属性の値を変更できますか?デフォルトはtrueです.
  • [[Value]]属性のデータ値は、デフォルトはundefinedです.
  • !ここでいうデフォルトとは、直接定義時のデフォルト値で、defineProperty()で定義されている属性のデフォルト値とは異なります.
    データ属性は、オブジェクトの字面量やnew Objectオブジェクトを直接使用して定義できますが、これらの特性値は直接アクセスできず、デフォルトの特性を変更するには、Objectオブジェクトに定義されているdefineProperty()関数を使用します.
    !Object.defineProperty()メソッドを呼び出した場合、configrable、enumerable、およびwritable特性のデフォルト値を指定しないとfalseです.
    例は以下の通りです
    //              
    var person = {
         };
    
    //            
    /*
    	             。
    	             。
    	               。(   configurable, enumerable, writable, value)
    */
    Object.defineProperty(person, "name", {
          
     writable: false, 
     value: "Nicholas" 
    });
    
    //                
    alert(person.name); //"Nicholas" 
    
    //       writable   false,   name          。(        )
    person.name = "Greg"; 
    alert(person.name); //"Nicholas"
    
    またconfigrableをfalseに設定し、オブジェクトから属性を削除できないことを示します.この属性に対してdeleteを呼び出すと、非厳格モードでは何も起こらず、厳格モードではエラーが発生します.プロパティを設定不可と定義したら、設定に戻すことはできません.この場合、Object.defineProperty()方法は、writable以外の特性を修正すると、エラーを引き起こします.
    1.2アクセス器のプロパティ
    アクセス属性にはデータ値が含まれていません.一対のgetterとsetter関数が含まれています.アクセス属性を読み込むと、getter関数が呼び出されます.この関数は有効な値を返します.アクセス属性を書き込みすると、setter関数を呼び出して新しい値を入力します.この関数はデータの処理方法を決定します.アクセス器の属性も4つの特性を含んでいます.
  • [[Configrable]]:プロパティをdeleteで削除することで属性を再定義することができるか、属性の特性を変更することができるか、または属性をデータ属性に変更することができるかを示します.デフォルトはtrueです
  • [[Enumerable]:for-iを通じて属性にアクセスできますか?デフォルトはtrueです
  • [[Get]:属性を読み出すときに呼び出す関数です.デフォルトはundefinedです.
  • [[Set]:属性を書き込む時に呼び出す関数で、デフォルト値はundefinedです.
  • アクセス器のプロパティは直接定義できません.Obiect.defineProperty()を使用して定義しなければなりません.定義されたプロセスはデータの属性に類似しています.
    var book = {
          
     _year: 2004,  //'_'                        
     edition: 1 
    }; 
    /*
    	             。
    	                。
    	               。(   configurable, enumerable, get, set)
    */
    Object.defineProperty(book, "year", {
          
    //         
     get: function(){
          
     return this._year; 
     }, 
     // set                    
     set: function(newValue){
          
     if (newValue > 2004) {
          
     this._year = newValue; 
     this.edition += newValue - 2004; 
     } 
     } 
    }); 
    book.year = 2005; 
    alert(book.edition); //2
    
    必ずしもゲッターとセッターを同時に指定しなくてもいいです.getterを指定するだけでは、属性は書き込みできないことを意味し、非厳格モードでの書き込みは無視されます.同様に、setter関数のみを指定する属性も読めません.非厳密モードではundefinedに戻ります.厳密なモードでは、getter関数のみを指定した属性と読み取りを試みると、setter関数のみを指定した属性が誤って書き込まれます.
    複数の属性を定義
    上で紹介したObject.defineProperty()の方法は単一の属性しか定義できません.Object.defineProperties()の方法は説明符を通して一回に複数の属性を定義することができます.Object.defineProperties()メソッドを呼び出した場合、configrable、enumerable、およびwritable特性のデフォルト値を指定しないとfalseです.例は以下の通りです
    var book = {
         }; 
    Object.defineProperties(book, {
          
    	//      
    	 _year: {
          
    	 	value: 2004 
    	 }, 
    	 edition: {
          
    	 value: 1 
    	 }, 
    	 //        
    	 year: {
          
    		 get: function(){
         
    		 	return this._year; 
    		 }, 
    		 set: function(newValue){
          
    			 if (newValue > 2004) {
          
    			 this._year = newValue; 
    			 this.edition += newValue - 2004; 
    		 	} 
    	 	} 
    	} 
    });
    
    属性の特性を読み取る
    JSのObjectです.getOwn PropertyDescriptor()方法は、所与のオブジェクト属性記述子を取得することができる.前のセクションで定義されたbookオブジェクトには、以下の例があります.
    //                                  
    var descriptor = Object.getOwnPropertyDescriptor(book, "_year"); 
    alert(descriptor.value); //2004 
    alert(descriptor.configurable); //false
    alert(typeof descriptor.get); //"undefined" 
    
    var descriptor = Object.getOwnPropertyDescriptor(book, "year"); 
    alert(descriptor.value); //undefined 
    alert(descriptor.enumerable); //false 
    alert(typeof descriptor.get); //"function"
    
    JavaScriptでは、任意のオブジェクトに対して、DOMとBOMオブジェクトを含むObject.getOwn PropertyDescriptor()方法を使用することができます.