javascript----对象特性

修改属性默认的特性:

  Object.defineProperty(属性所在的对象,属性名字,描述符对象)
  在调用Object.defineproperty()方法创建一个新的属性时,
  如果不指定,configurable、enumerable和writable特性的默认值都为false

描述符对象:

    属性对象必须为:configurable、enumerable、writable和value其中的一个或多个值

如:
var person = {}; Object.defineProperty(person,"name",{ writable:false, value:"LiAo" }) alert(person.name); // “LiAo” person.name = "MrLiao"; alert(person.name) ; //"LiAo"

属性类型

  • 数据属性
    • configurable: 能否delete、能否修改特性、能否修改为访问器属性,默认为true, ps: 一旦设置为false后不可逆转
    • enumerable: 能否通过for-in循环返回属性,默认为true
    • writable: 能否修改属性值,默认为true
    • value: 包含着这个属性的值,默认为undefined
  • 访问器属性

访问器属性不包含数据值,而是包含一对getter和setter函数(不是必须)
读取访问器属性——>调用getter,负责返回有效的值
写入访问器属性——>调用setter,负责如何处理数据

  • configurable: 同上
  • enumerable:同上
  • Get:读取属性时调用的函数,默认值为undefined
  • Set:写入属性时调用的函数,默认值为undefined
使用访问器属性的常见方式:设置一个属性的值会导致其他属性发生变化:
    var book = {
     _year:2004,
     edition:1
      };
     Object.defineProperty(book,"year",{
     get:function(){
             return this._year;
     },
     set:function(newValue){
             this._year = newValue;
             this.edition += newValue -2004;
      }
    }
    });
      book.year = 2005;
      alert(book.edition);   //2  

注意如果不是同时制定getter和setter的话,如只指定getter意味着属性时不可写的,写入属性会被忽略。所以要根据需求指定这两个函数,不然会出现一些小毛病哈

定义多个属性

使用Object.defineProperities()方法
var book = {}; Object.defineProperties(book,{ 第一个数据属性名:{ writable等特性: 布尔值 value: 属性值 }, 第一个数据属性名:{ writable等特性: 布尔值 value: 属性值 }, 第一个访问器属性名:{ get:function(){} set : function(){} },

读取属性的特征

 Object.getOwnPropertyDescriptor(属性所在的对象,属性名称)
 若是数据属性,返回包含configurable,enumberable,writable,value属性的对象
 若是访问器属性,返回包含configurable,enumberable,get,set属性的对象

你可能感兴趣的:(javascript----对象特性)