Object.defineProperty

Object.defineProperty()

定义新属性或修改原有的属性,并返回这个对象。

Object.defineProperty(obj, prop, descriptor)

参数: obj:必需。目标对象 prop:必需。需定义或修改的属性的名字 descriptor:必需。目标属性所拥有的特性

给对象的属性添加特性描述,目前提供两种形式:数据描述存取器描述

数据描述符是一个拥有可写或不可写值的属性。 存取描述符是由一对 getter-setter 函数功能来描述的属性。 描述符必须是两种形式之一;不能同时是两者。

数据描述

**enumerable**:此属性是否可以被枚举(使用for…in或Object.keys()),默认为false

**value**:属性值,可以是任意类型,默认undefined

**writable**:属性值是否可以被重写,默认为false

**configurable**:是否可以删除目标属性或是否可以再次修改属性的特性(writable, configurable, enumerable),设置为true可以被删除或可以重新设置特性;设置为false,不能被可以被删除或不可以重新设置特性,默认为false

提示:一旦使用Object.defineProperty给对象添加属性,那么如果不设置属性的特性,那么configurable、enumerable、writable这些值都为默认的false

  var obj = {
      test:"hello"
  }
  //对象已有的属性添加特性描述
  Object.defineProperty(obj,"test",{
      configurable:true | false,
      enumerable:true | false,
      value:任意类型的值,
      writable:true | false
  });
  //对象新添加的属性的特性描述
  Object.defineProperty(obj,"newKey",{
      configurable:true | false,
      enumerable:true | false,
      value:任意类型的值,
      writable:true | false
  });

存取器描述

  var obj = {};
  Object.defineProperty(obj,"newKey",{
      get:function (){ return ... } | undefined,
      set:function (value){} | undefined
      configurable: true | false
      enumerable: true | false
  });

注意:

  1. 当使用了getter或setter方法,不允许使用writable和value这两个属性。

  2. get或set不是必须成对出现,任写其一就可以。如果不设置方法,则get和set的默认值为undefined。

  3. 当读取某个属性时,在对象内部调用了get方法,该方法必须要有return语句。

  4. 当设置某个属性时,在对象的内部调用了set方法,该方法接收唯一参数给属性赋值。

—— getter/setter
  var obj = {};
  var initValue = 'hello';
  Object.defineProperty(obj,"newKey",{
      get:function (){
          //当获取值的时候触发的函数
          return initValue;
      },
      set:function (value){
          //当设置值的时候触发的函数,设置的新值通过参数value拿到
          initValue = value;
      }
  });
  //获取值
  console.log( obj.newKey );  //hello

  //设置值
  obj.newKey = 'change value';
  console.log( obj.newKey ); //change value

原文参考:理解Object.defineProperty的作用 / 辣手摧js