数据属性

数据属性包含一个数据值的位置,在这个位置可以读取和写入值。

数据属性有4个描述其行为的特性:

  • [[Configurable]]:决定能否修改属性的特性值,能否delete属性,默认值true
  • [[Enumerable]]:决定能否通过for-in循环返回属性。默认值true
  • [[Writable]]:决定能否修改属性的值。默认值true
  • [[Value]]:决定这个属性的数据值。默认值undefined
var obj = {
  name: 'joy'
};
//  obj 的 name属性的如下三个特性都为true:
//  [[Configurable]]、[[Enumerable]]、[[Writable]]
//  而[[Value]]特性中存储的值为 'joy'

要修改属性默认的特性,需要使用ECMA-5提供的Object.defineProperty()方法。

注意:在调用Object.defineProperty()方法时,如果不显式指定 configurable、enumerable、writable,则这些特性的值都会被设置为false

//  [[Writable]]:

var obj = {};
Object.defineProperty(
  obj, //属性所属的对象
  'name', //属性名称
  {
    configurable: true,
    enumerable: true,
    writable: false,
    value: 'joy'
  }
);

console.log(obj.name); // joy
obj.name = 'tom';
console.log(obj.name); // joy

//  上述代码为obj创建了一个名为name的属性,值为 'joy'
//  通过将属性特性writable设置为false来达到是name属性只读的目的
//  非严格模式下修改name的值会静默失败,严格模式下会throw TypeError
//  [[Configurable]]:

var obj = {};
Object.defineProperty(
  obj, //属性所属的对象
  'name', //属性名称
  {
    configurable: false,
    enumerable: true,
    writable: true,
    value: 'joy'
  }
);

console.log(obj.name); // joy
delete obj.name;
console.log(obj.name); // joy

//  configurable设置为false,同样能使属性变为只读,且不能从对象obj中删除属性name
//  如果对这个属性调用delete,非严格模式下静默失败,严格模式下会throw TypeError
//  且将configurable设置为false之后,将再也无法修改除writable之外的任何属性特性了

你可能感兴趣的:(数据属性)