对象的属性-13

2016-09-05-day13 am


1.对象的属性: ES认为对象就是属性的集合

属性分为:

1.命名属性:自定义的或可直接用.访问到的属性

1).数据属性: 直接存储属性值得属性
  • 将每个属性都定义为四大特性:
    value: 实际存储当前属性值
    writable: 标识属性是否可修改
    enumerable: 标识属性是否可被for in遍历到。即使改为false,依然可用.访问到
    configurable: 标识能否删除属性或修改属性的其他特性

  • 为什么要给属性定义特性: 特性是对属性的保护,configurable保护其他特性

  • 如何访问特性:

Object.getOwnPropertyDescriptor(
    obj,"属性名"
) //返回一个对象,对象中包含了属性的四大特性
  • 如何修改属性的特性:
  1. 只修改一个属性的四大特性:
Object.defineProperty(obj,"属性名",{
   writable:false,
   configurable:false
})

强调: 为了防止其他人再将writable改回true,可将configurable一并设置false。
configurable一旦改为false,不可逆。

  1. 同时修改多个属性的四大特性:
Object.defineProperties(obj,{
属性名:{
    特性名:值,
    ...
  },
属性名:{
    特性名:值,
    ...
  }
  })

关于特性的默认值: defineProperty/defineProperties,如果要修改的属性不存在,会自动添加新属性。但是,被defineXXX添加的新属性,所有特性默认值为false!

2).访问器属性: 不直接存储属性值,而是对其他属性提供保护的一种特殊属性。
  • 何时: 如果使用自定义的验证规则保护属性时。
  • 四大特性:
set:function(val){
验证val
如果验证通过,才将val赋值给受保护的数据属性
}//只要对访问器属性赋值时,自动调用访问器属性的set方法
get:function(){
  return 受保护的数据属性的值
}//只要使用访问器属性取值时,自动调用访问器属性的get方法

enumerable: 同数据属性
configurable: 同数据属性
如何定义:都用defineProperty/defineProperties

2.内部属性:不建议或不允许访问的属性

比如: proto class
extensible: 标识一个对象是否可扩展新属性。默认值true。

防篡改: 限制对已经创建的对象中的属性进行重新配置。

  • 为什么: 严格的语言中,要求对象一旦创建,属性不允许擅自增减。
  • 何时: 今后,只要不允许对已经创建的对象的属性进行添加和删除操作时。
  • 如何: 3个级别:
1)). 防扩展: 禁止向对象中添加新属性

判断一个对象是否可扩展: Object.isExtensible(obj)
设置一个对象不可扩展:Object.preventExtensions(obj)相当于修改obj的extensible为false

2)). 密封: 在兼具防扩展的基础上,进一步禁止删除对象中的属性

判断当前对象是否密封:Object.isSealed(obj)
修改当前对象为密封:Object.seal(obj),相当于:修改obj的extensible为false,将所有属性的configurable特性都改为false。

3)). 冻结: 在兼具密封的基础上,进一步禁止修改所有属性的值

何时: 只要希望一个对象中的属性值一旦创建,不可改变时,就要冻结对象
判断一个对象是否被冻结:Object.isFrozen(obj)
冻结一个对象:Object.freeze(obj)


  1. Object.create()
    设置继承有几种方法:
    1.Object.setPrototypeOf(child,father)
    2.构造函数.prototype
    3.两种类型间的继承:抽象父类型、借用构造函数;设置子类型原型继承父类型元素
    4.创建一个新对象,继承父对象,并扩展自有属性。
    如何:
var child=Object.create(father,{
  新属性:{
    四大特性
  },
  新属性:{
    四大特性
  }
})

你可能感兴趣的:(对象的属性-13)