javascript之对象

作者 likaiqiang 日期 2019-11-17
javascript之对象

对象的两种属性

对象有两种类型的属性。分别是:数据属性和存储器属性。前者是普通的key/value,后者是由getter/setter定义的属性。

var obj = {
a:1,
b:2,
get x(){
return Math.random() * 100
},
set x(value){
this.a = value
}
}

上例中a和b属于数据属性,x属于存储器属性

对象属性的特性

不管是数据属性或者存储器属性都包含一个名字和四个特性。

数据属性的四个特性包括:

  1. 对象属性的值
  2. 可写性
  3. 可枚举性
  4. 可配置性

存储器属性的四个特性包括:

  1. 读取(get)
  2. 写入(set)
  3. 可枚举性
  4. 可配置性

属性描述符

ES3是不能对属性的可写性/可枚举性/可配置性进行配置的。ES5新增了一个叫做属性描述符的对象,可以通过Object.defineProperty对四个特性进行配置/修改。同时可以通过Object.getOwnPropertyDescriptor()来获取某个属性的属性描述符。

var obj = {
a:100
}
Object.getOwnPropertyDescriptor(obj,'a') //{configurable: true,enumerable: true,value: 100,writable: true}
var obj = {
a:100,
get x(){
return Math.random() * 100
}
}
Object.getOwnPropertyDescriptor(obj,'x') //{configurable: true,enumerable: true,get: ƒ x(),set: undefined}
var obj = {
a:100
}
Object.defineProperty(obj,'x',{
value: "hello"
})
Object.getOwnPropertyDescriptor(obj,'x') //{configurable: false,enumerable: false,value: "hello",writable: false}

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,{
a:{
configurable: true,
enumerable: true,
value: 1,
writable: true
},
b:{
configurable: true,
enumerable: true,
value: 2,
writable: true
}
})