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

2018-04-24  本文已影响0人  前端刊物_bill

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

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

数据属性(数据描述符)

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

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

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

一些操作这些属性的方法

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

语法

Object.defineProperty(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>

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

语法

Object.defineProperties(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
上一篇 下一篇

猜你喜欢

热点阅读