面向对象--属性

对象的属性 分为 : 数据属性 以及 访问器属性.
 
1.数据属性
  1.1 数据属性的特性
    对象的每个普通属性都有四个特性 :
      [ [ Configurable ] ] , [ [ Enumerable ] ] , [ [ Writable ] ] , [ [ Value ] ]
      前三个的默认值都是true,最后的Value默认值是undefined
 
    Configurable
      为true时,表示:
        ①.该属性可以用delete操作符来 删除属性 从而重新定义属性.
        ②.该 属性的特性 可以被更改.
        ③.该属性可以被修改为 访问器属性(getter ,setter)
 
    Enumerable
      为true时,表示
        ①.该属性可以被for-in语句访问到.(in操作符应该也遵循此规律).
 
    Writable
      为true时,表示
        ①.该 属性的值 可以被修改.
    
    Value
      表示属性的值.当属性值读取时,在这个位置被读取;当设置属性值时,值会被设置在这里.
 
 
  1.2 修改属性的特性
    必须使用js提供的 Object.defineProperty(target, propertyName, descriptor);
      target : 属性所在的对象
      propertyName : 要修改的属性名称
      descriptor : 表示属性的特性的对象
      
      其中,descriptor 必须是如下格式 , 可以四个都配置,也可以省略其中的一部分不写.
          {
            configurable: true/false,
            writable:     true/false,
            enumerable:   true/false,
            value:        xxx
          }
 
2.访问器属性
  2.1 访问器属性的特性
    每个访问器属性同样有四个特性:
      [ [ Configurable ] ] , [ [ Enumerable ] ] , [ [ Set ] ] , [ [ Get ] ]
 
  2.2 定义/修改 访问器属性
    只能使用 Object.defineProperty(target,propertyName,descriptor);
 
    例如:
        var book = { _year: 2004, edition: 1 };
        Object.defineProperty(book ,"year", {
            get: function(){
              return this._year ;
            },
            set: function(value){
              if(value > 2004){
                this.edition += value - this._year ;
                this._year = value ;
              }
            }
        });
 
        book.year = 2005 ;
        console.log(book.edition); // display 2
 
 
3.同时定义多个属性
  使用 Object.defineProperties(target , props);
 
  示例:
    var book = {};
 
    Object.defineProperties(book , {
      _year : {
        writable : true ,
        value : 2004
      },
      edition : {
        writable : true ,
        value : 1
      },
      year : {
        get : function(){
          return this._year ;
        },
        set : function(value){
          if(value > 2004){
            this.edition += (value - this._year);
            this._year = value ;
          }
        }
      }
    });
 
 
4.读取属性的特性
  使用 Object.getOwnPropertyDescriptor( target , propertyName);
  返回值是个 descriptor对象 , 包裹着对应的属性特性.
 
  示例:
      var desc = Object.getOwnPropertyDescriptor(book , "year") ;
      console.log(desc.value , desc.configurable , typeof desc.get );
 
 
 
注: 本页中 所有的 Object.defineXxxxx() 函数 必须在 IE9+ 使用(包含IE9);
 
 
 
 
posted @ 2019-07-04 13:22  豆豆飞  阅读(357)  评论(0编辑  收藏  举报