Object对象的属性、方法

12 阅读2分钟

Object对象的属性、方法

一、元属性

  • value: undefined,该属性的属性值
  • writable: true,是否可被修改
  • enumerable: true,是否可枚举。如果设为false,会使得某些操作(比如for...in循环、Object.keys())跳过该属性
  • configurable: false,可配置性。如果设为false,将阻止某些操作改写该属性,比如无法删除该属性,也不得改变该属性的属性描述对象(value属性除外)
  • get: undefined,取值函数(getter)
  • set: undefined,存值函数(setter)
  • 当使用了getter或setter方法,不允许使用writable和value这两个属性(如果使用,会直接报错)

二、对象上的方法

1、Object.defineProperty(obj, prop, desc)

  • 直接在一个对象上定义新的属性或修改现有属性,并返回该对象
  • obj:要定义属性的对象
  • prop:要定义或修改的属性的名称
  • desc:要定义或修改的属性描述符,一般是一个对象(元属性)
const a = { name: 'aaa' };
Object.defineProperty(a, 'age', {
  value: 18,
})
console.log(a.age); // 18

2、Object.defineProperties(obj, props)

  • 直接在一个对象上定义新的属性或修改现有属性,并返回该对象
  • obj:要定义属性的对象
  • props:属性描述对象
const obj = Object.defineProperties({}, {
  p1: { value: 123 },
  p2: { value: 'abc' },
  p3: { get: function () { return this.p1 + this.p2 } }
});

obj.p1 // 123
obj.p2 // "abc"
obj.p3 // "123abc"

3、Object.getOwnPropertyDescriptor(obj, prop)

  • 返回指定对象上一个自有属性对应的属性描述符,不能用于继承的属性
  • obj:要查询的目标对象
  • prop:要查询的属性名称
const  obj = { name: 'zhang' }
Object.getOwnPropertyDescriptor(obj, 'name')
// {
// value: "zhang", 
// writable: true, 
// enumerable: true, 
// configurable: true
// }

4、Object.getOwnPropertyNames(obj)

  • 获取对象自身的全部属性的属性名数组
const  obj = { name: "zhang" }
Object.getOwnPropertyNames(obj) //["name"]

5、Object.prototype.propertyIsEnumerable(prop)

  • 判断给定的属性是否可枚举
  • 继承原型对象的属性不可遍历
const  obj = { name: "zhang" }
obj.propertyIsEnumerable('name') // true
obj.propertyIsEnumerable('toString') // false

三、控制对象状态

1、Object.preventExtensions()使得一个对象无法再添加新的属性

  • Object.isExtensible()检查是否可以为一个对象添加属性
var obj = new Object();

Object.isExtensible(obj) // true
Object.preventExtensions(obj);
Object.isExtensible(obj) // false

2、Object.seal()使得一个对象既无法添加新属性,也无法删除旧属性

  • Object.isSealed()检查一个对象是否使用了Object.seal方法
var obj = { name: 'AndyZhang' };

Object.seal(obj);
Object.isSealed(obj) // true

3、Object.freeze()使得一个对象无法添加新属性、无法删除旧属性、也无法改变属性的值

  • Object.isFrozen()检查一个对象是否使用了Object.freeze方法
var obj = { name: 'AndyZhang' };

Object.freeze(obj);
Object.isFrozen(obj) // true