JavaScript对象属性的特性

Posted on 2017-07-19 22:27  浪去郎来  阅读(341)  评论(0)    收藏  举报

声明:此文是小编对《JavaScript高级程序设计》的总结笔记

 

面向对象(Object-Oriented)就是OO语言

官方定义:无序属性的集合,其属性可以包含基本值、对象或者函数。

属性类型: 分为数据属性、访问器属性

  一、数据属性:

      特性:

【【Configurable】】表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性   默认为true
【【Enumerable】】表示能否通过for-in循环返回属性           默认为true
【【Writable】】表示能否修改属性的值    默认为true
【【Value】】包含这个属性的数据值    默认为default

       修改特性的方法:Object.defineProperty(),这个方法接收三个参数,属性所在的对象、属性的名字、描述符对象(就是指的属性的特性)。

        例:

var person = {};
Object.defineProperty(person,"name",{
writable : false,
value : "Nicholas"
});

      注!:  

        1、当把属性设置为只读(既writable:false),则不能再对该属性赋值,在严格模式下会出错。

        2、当把configurable设置为false,表示不能从对象中删除属性。如果对这个属性调用delete,则在严格模式下会导致错误。而且,一旦把属性定义为不可配置的,就不能在把它变回可配置了。此时,再调用Object.defineProperty()方法修改除writable之外的特          性,都会导致                                    错误。

        3、第一次调用Object.defineProperty()方法,如果不指定,configurable]enumerable和writable特性的默认值都会变成false,再调用该方法修改某一特性则其他特性保持不变

  二、访问器属性:

      特性:

【【Configurable】】表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性 默认为true 
【【Enumerable】】表示能否通过for
-in循环返回属性           默认为true
【【Get】】在读取属性时调用的函数    默认值为undefined
【【Set】】在写入属性时调用的函数    默认值为undefined

         修改访问器属性的方法:Object.defineProperty(),和修改数据属性的方法一样

        例:

var book = {
        _year : 2004,   //下划线是一种约定俗成的常用记号,表示只通过对象方法调用,平时不调用,在属性命名规则上没有特殊意义
        edition:1
    };

Object.defineProperty(book,"year",{
        get:function () {
            return this._year;
        },
        set : function (newValue) {
            if(newValue > 2004)
            {
                this._year = newValue;
                this.edition += newValue - 2004;
            }
        }
    });
    
    book.year = 2005;
    alert(book.edition)  //2

       注!:

        1、只指定get意味着属性时不能写,只指定set函数的属性也不能读。

      拓展:

        某些浏览器还支持两种保留的方法来设置set个get函数

var book ={
        _year:2004,
        edition:1
    };

    book.__defineGetter__("year",function () {
        return this.year;
    });

    book.__defineSetter__("year",function (newValue) {
        if (newValue > 2004){
            this._year = newValue;
            this.edition += newValue -2004;
        }
    });

    book.year = 2005;
    alert(book.edition);

        注!:在不支持Object.defineProperty()方法的浏览器中不能修改【【Configurable】】和【【Enumerable】】属性

  三、定义多个属性:Object.defineProperties(),此方法接收两个对象参数,第一个对象是要添加和修改其属性的对象名称,第二个对象是要添加或修改的属性键值对

      例:

var book = {};
  Object.defineProperties(book,{
      _year : {
          writable : true,
          value : 2004
      },
      edition : {
          writable : true,
          value : 1
      },
      year : {
          get:function () {
              return this._year;
          },
          set : function (newValue) {
              if (newValue > 2004)
              {
                  this._year = newValue;
                  this.edition += newValue - 2004;
              }
          }
      }
  })

 

  四、读取属性的特性:Object.getOwnPropertyDescriptor(),此方法接收两个参数:属性所在的对象和要读取其描述符的属性名称。返回的是一个对象,该对象是对应属性的特性键值对。

    例:

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;
              }
          }
      }
  });

  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"
    /*
    对于数据属性_year,value等于最初的值,configurable是false,get等于undefined。
    对于访问器属性year,value等于undefined,enumerable是false,get是一个纸箱get函数的指针。
     */