ウェブデザインの実戦的JavaScript(7)--対象属性の特性値


オブジェクト属性には名前と値の他に、書き込み可能、列挙可能、設定可能ないくつかの識別機能が含まれています.ECMAScript 3ではこれらの特性は設定できません.すべてのECMAScript 3プログラムで作成された属性は書き込み可能、列挙可能、配置可能であり、これらの特性を修正することができません.ECMAScript 5は、ライブラリ開発者にとって重要なこれらの属性特性を問い合わせるAPIを提供し、設定する.
データ属性は、4つの特性を含む.値、可読性、エニュメレート・コンフィギュレーション.
アクセサ属性は値特性(getter方法の存在の有無によって決定される)と書き込み可能性がない(setter方法の存在の有無によって決定される).
属性特性のクエリーと設定操作を実現するために、ECMAScript 5は「属性記述子」というオブジェクトを定義し、このオブジェクトはその4つの特性を表しています.属性記述子オブジェクトの属性と記述された属性特性は同名であるため、その属性は、value、writable、enumerable、configrableである.アクセサ属性の記述子オブジェクトは、valueとwritableの代わりにgetとsetを使用します.
Object.getOwn PropertyDescriptor()を呼び出して、あるオブジェクトの特定の属性値の属性記述子を得ることができます.
1.属性の特性は次の6つを含む.
  • configrable:プロパティをdeleteで削除して属性を再定義できるかどうかを示し、属性の特性を変更することができます.デフォルトはtrue
  • です.
  • enumberbale:for-i nを通じて属性にループバックできるかどうかを示します.デフォルトはtrue
  • です.
  • writable:属性を変更することができますか?デフォルトはtrue
  • です.
  • value:この属性のデータ値を含む.属性値を読み込むとき、この属性から読み、属性を書き込むとき、新しい値をこの位置に保存します.デフォルト値はundefineです.
  • getter:属性の読み取り時に呼び出す関数
  • setter:属性の書き込み時に呼び出す関数
  • Object.defineProperty方法を呼び出した後、それらの未定義の特性値はconfigrableがfalseである以外、他はundefinedである.
    2、単一属性の特性を変更する:
    Object.defineProperty()方法を使用しなければなりません.この方法は3つのパラメータを受け入れる.
  • 属性があるオブジェクト
  • 属性の名前
  • のディスクリプタオブジェクト.
  • ここで、ディスクリプタオブジェクトの属性は、configrable、enumberble、writable、valueでなければなりません.そのうちの一つまたは複数の値を設定して、対応する特性値を変更することができます.
    また、一旦、私たちはある属性の特性を設定して、配置不可にしたら、これを配置可能なものに戻すことはできなくなります.この場合、Object.definePropertyを呼び出す方法は、writable以外の特性を修正するとエラーが発生します.
    (1)、writableの特性を修正する:
    falseに設定します.属性値を変更できないようにします.
    var person = {};
    Object.defineProperty(person, "name", {
      writable: false,//             
      value: "Tom"  // name     Tom
    });
    person.name = "Jany"; //   name      Jany,     .            ,         
    console.log(person.name); //     Tom
    
    (2)configrabel特性を修正し、
    falseに設定されているので、プロパティはdelete(削除)できません.
    var person = {};
    Object.defineProperty(person, "name", {
      configurable: false, // configurable   false
      value: "Tom"
    });
    console.log(person.name); //     Tom
    delete person.name; //    name  
    console.log(person.name); //  name    ,   Tom
    
    configrable属性値をtrueに変更すれば、プロパティはdeleteに変更できます.
     var person = {};
    Object.defineProperty(person, "name", {
      configurable: true,
      value: "Tom"
    });
    console.log(person.name); //   Tom
    delete person.name; //    name  
    console.log(person.name); //    ,   udefined
    
    また、一旦、私たちはある属性の特性を設定したら、もう配置可能なものに戻すことができなくなります.この時、Object.defineProperty()を呼び出して、writable以外の特性を修正すると、エラーが発生します.
    var person = {};
    // person.name   configurable   false;
    Object.defineProperty(person, "name", {
      configurable: false,
      value: "Tome"
    });
    //       person.name   configurable   true;           。
    Object.defineProperty(person, "name", {
      configurable: true,
      value: "lyl"
    });
     
    console.log(person.name);
    
    (3)、getterとsetterの特性を修正する
     //      book
    var book = {
      _year: 2004, //    
      edition: 1  //   
    };
    
    //  year     
    Object.defineProperty(book, "year", {
      //  get  ,       book.year  year  ,      book._year  
      get: function() {
        return this._year;
      },
      //   set  ,   book.year     ,      book._year book.edition  
      set: function(newValue) {
        if(newValue > 2004) {
          this._year = newValue;
          this.edition += newValue - 2004;
        }
      }
     
    });
     
    book.year = 2005;
    console.log(book.edition); //2
    
    3、複数の属性を同時に定義(修正)する特性
    Object.definePropertiesを使って説明符で複数の属性を一度に定義します.この方法では2つのオブジェクトのパラメータを受け付けます.最初のオブジェクトは追加と修正の対象です.2番目のオブジェクトの属性は最初のオブジェクトに追加または変更する順序に対応します.
    var book = {};
    Object.defineProperties(book, {
      //         _year,      2004
      _year: {
        value: 2004
      },
      //         edition,        1,          
      edition: {
        value: 1,
        writable: true//     
      },
      //         year,       get set  
      year: {
        get: function() {
          return this._year;
        },
        set: function(newValue){
          if(newValue > 2004) {
            //alert("ok");
            this._year = newValue;
            this.edition += newValue-2004;
          }
        }
      }
    });
     
    book.year = 2006;
    console.log(book.edition);//3
    
    4.属性の特性を読み取る
    属性の特性を読み込み、Object.getOwn PropertyDescriptrメソッドを使用します.
    
    var book = {};
    //           
    Object.defineProperties(book, {
      _year: {
        value: 2004
      },
      edition: {
        value: 1,
        writable: true//     
      },
      year: {
        get: function() {
          return this._year;
        },
        set: function(newValue){
          if(newValue > 2004) {
            //alert("ok");
            this._year = newValue;
            this.edition += newValue-2004;
          }
        }
      }
    });
     
    //  _year     
    var descriptor1 = Object.getOwnPropertyDescriptor(book, "_year");
    console.log(descriptor1.configurable); //false
    console.log(descriptor1.enumberable); //undefinded
    console.log(descriptor1.writable); //false
    console.log(descriptor1.value); //2004
    console.log(descriptor1.get); //undefined
    console.log(descriptor1.set); //undefined
     
    console.log("
    "
    ); // year var descriptor2 = Object.getOwnPropertyDescriptor(book, "year"); console.log(descriptor2.configurable); //false console.log(descriptor2.enumberable); //undefined console.log(descriptor2.writable); //undefined console.log(descriptor2.value); //undefined console.log(descriptor2.get); //function() console.log(descriptor2.set); //function(value)