对象的两种属性
对象有两种类型的属性。分别是:数据属性和存储器属性。前者是普通的key/value,后者是由getter/setter定义的属性。
var obj = { |
上例中a和b属于数据属性,x属于存储器属性
对象属性的特性
不管是数据属性或者存储器属性都包含一个名字和四个特性。
数据属性的四个特性包括:
- 对象属性的值
- 可写性
- 可枚举性
- 可配置性
存储器属性的四个特性包括:
- 读取(get)
- 写入(set)
- 可枚举性
- 可配置性
属性描述符
ES3是不能对属性的可写性/可枚举性/可配置性进行配置的。ES5新增了一个叫做属性描述符的对象,可以通过Object.defineProperty对四个特性进行配置/修改。同时可以通过Object.getOwnPropertyDescriptor()来获取某个属性的属性描述符。
var obj = { |
var obj = { |
var obj = { |
Object相关方法
for in、hasOwnPreperty与propertyIsEnumerable
说三个容易混淆的:
for in会遍历对象的自有属性与继承属性中的可枚举属性。hasOwnPreperty判断对象的某个属性是不是自有属性。propertyIsEnumerable是hasOwnPreperty的增强版,在hasOwnPreperty的基础上同时会判断对象的某个属性是不是可枚举的。
getOwnPropertyNames
此方法为Object的静态方法。此方法会返回对象的自有属性的名字集合,结果为数组,包括不可枚举属性。
getPrototypeOf
此方法为Object的静态方法。此方法会返回某个对象的原型对象。
Object.getPrototypeOf(obj) === obj.__proto__ //true |
isExtensible()
此方法为Object的静态方法。此方法会判断一个对象是否可扩展,不可扩展的对象不可以新增属性。
preventExtensible
此方法为Object的静态方法。此方法会改变一个对象的扩展性,并且不可逆。也就是说一旦一个对象被变成不可扩展的,就变不回来了。
创建对象(三种方法)
对象直接量
通过new 创建对象
Object.create
Object.create有两个参数。第一个参数是待创建对象的原型,可以传入null来创建一个没有原型的对象。第二个参数等同Object.defineProperties()的第二个参数。
var obj = {a:1,b:2} |
相当于
var obj = Object.create(Object.prototype,{ |