【JS第18期】属性类型详解

属性类型为了实现javascript 引擎用的,因此在javascript中不能访问它们。为了表示特性是内部值,规范中约定将它们定义到两对方括号中,如:[[Enumerable]]

属性类型分为两种:数据属性和访问器属性

数据属性(数据描述符)

数据属性包含一个数据值的位置。可以进行读写操作。包括4个描述其行为的特性

  • [[Configurable]] 表示该属性能否进行修改或删除操作,能否把属性修改为访问器属性。如果旧描述符将其configurable 属性设置为false,则该属性被认为是“不可配置的”,并且没有属性可以被改变(除了单向改变 writable 为 false)。当属性不可配置时,不能在数据和访问器属性类型之间切换。
  • [[Enumerable]] 表示能否通过for-in循环,也就是是否可枚举
  • [[Writeable]] 表示能否修改该属性,当writable属性设置为false时,该属性被称为“不可写”。试图写入非可写属性不会改变它,也不会引发错误。
  • [[Value]] 表示这个属性的数据值,用于读取属性值。写入新值时,这个旧值会被替换。默认值undefined

访问器属性(存取描述符)

访问器属性不包含数据值,它们包含两个函数分别时getter 和 setter (这两个函数不是必须的)。在读取访问器属性时,会调用getter方法;在写入访问其属性时,会调用setter方法并会传入一个参数为新值。同样包括几个特性。如下:

  • [[Get]] 在读取访问器属性时,会调用getter方法。 默认值undefined
  • [[Set]] 在写入访问其属性时,会调用setter方法并会传入一个参数为新值。默认值undefined

一些操作这些属性的方法

  • Object.defineProperty()

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

语法

Object.defineProperty(obj, prop, descriptor)

参数

  • obj 要在其上定义属性的对象。
  • prop 要定义或修改的属性的名称。
  • descriptor 将被定义或修改的属性描述符。

返回值

被传递给函数的对象。

ES6

在ES6中,由于 Symbol类型的特殊性,用Symbol类型的值来做对象的key与常规的定义或修改不同,而Object.defineProperty 是定义key为Symbol的属性的方法之一。

如果一个描述符不具有value,writable,get 和 set 任意一个关键字,那么它将被认为是一个数据描述符。如果一个描述符同时有(value或writable)和(get或set)关键字,将会产生一个异常

实例

var o = {}; // 创建一个新对象

// 在对象中添加一个数据属性的示例
Object.defineProperty(o, "a", {
  value : 37,
  writable : true,
  enumerable : true,
  configurable : true
});

// 对象o拥有了属性a,值为37

// 在对象中添加一个访问器属性的示例
var bValue;
Object.defineProperty(o, "b", {
  get: function(){
    return bValue;
  },
  set: function(newValue){
    bValue = newValue;
  },
  enumerable : true,
  configurable : true
});

o.b = 38;

// 对象o拥有了属性b,值为38

// o.b的值现在总是与bValue相同

// 数据属性和访问器属性不能混合使用
Object.defineProperty(o, "conflict", {
  value: 0x9f91102, 
  get: function() { 
    return 0xdeadbeef; 
  } 
});
// Uncaught TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute, #

  • Object.defineProperties()

Object.defineProperties() 方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。

语法

Object.defineProperties(obj, props)

参数

  • obj 在其上定义或修改属性的对象。
  • props 要定义其可枚举属性或修改的属性描述符的对象。对象中存在的属性类型主要有两种:数据属性和访问器属性

返回值

传递给函数的对象。

实例

var obj = {};
Object.defineProperties(obj, {
  'property1': {
    value: true,
    writable: true
  },
  'property2': {
    value: 'Hello',
    writable: false
  }
  // etc. etc.
});
qrcode_for_gh_76cb9bd1051f_344.jpg

你可能感兴趣的:(【JS第18期】属性类型详解)