JavaScript < ES5、ES6、ES7、… >前端

JavaScript中Object总结

2019-04-18  本文已影响30人  迦叶凡

前言

本篇文章用来记录JavaScript中Object的相关知识点,如有错误,欢迎指正~

正文

1.Object之禁止扩展

Object.preventExtensions(obj)

//下面这个方法可以检测obj是否是可扩展的
Object.isExtensible(obj)

这里的禁止扩展指的是当一个对象被创建,且被设为不可在扩展,那么之后该对象无法添加新的属性和方法。但对已存在的属性还是可以继续进行操作的。
如若强行添加属性或方法,在非严格模式下会是undefined,而在严格模式下则会抛错。

2.Object之密封对象

Object.seal(obj)

//下面这个方法可以检测obj是否是可扩展的
Object.isSealed(obj)

所谓的密封对象指的是对象属性不可扩展,已存在的属性的[[Configurable]]被设为false,因此无法删除。不能使用Object.defineProperty()把数据属性修改为访问器属性,反之一不行。但是可以修改已存在的属性的Value。

3.Object之冻结对象

Object.freeze(obj)

所谓冻结对象指的是对象既不可扩展,也是密封的,而且对象数据属性的[[Writable]]设为false。但是如果定义了[[Set]]函数,访问器属性仍然是可写的。

4.Object之数据属性
JavaScript的对象存在两种属性:数据属性和访问器属性。
数据属性:
[[Configurable]]:表示能否通过delete删除属性,能否修改属性的特性,或者能否把属性修改为访问器属性。
[[Enumerable]]:表示能否通过for-in返回属性。
[[Writable]]:表示能都修改属性的值。
[[Value]]:包含这个属性的数据值,默认为undefined。

Object.definedProperty(obj, key, {
    configurable: false,
    writable: false,
    enumerable: false,
    value: 123
})

注意一下几点:

  1. 当把configurable设为false后,就不可在设回可配置状态。此时,调用Object .defineProperty()方法修改除了writable之外的特性,都会报错。
  2. 在使用Object.defineProperty()创建一个新的属性时,[[Configurable]]、[[Enumerbale]]、[[Writable]]特性的默认值都false。(一般不会用这种方法是去创建一个属性的哈~~)

5.Object之访问器属性
访问器属性不包含数据值,它包含一对get和set函数。在读取访问器属性时,会调用get函数,该函数返回有效值;在写入访问器属性时,会调用set函数并传入新值,这个函数决定了如何处理数据。访问器属性有如下4个特性:
[[Configurable]]:表示能否通过delete删除属性,能否修改属性的特性,或者能否把属性修改为访问器属性。
[[Enumerable]]:表示能否通过for-in返回属性。
[[Get]]:在读取属性时调用的函数,默认值为undefined。
[[Set]]:在写入属性时调用的函数,默认值为undefined。

6.Object.defineProperties()
Object.defineProperties()方法可以用于同时操作多个属性。

Object.defineProperties(obj, {
  key1: {
    configurable: true,
    enumerable: false,
    writable: true,
    value: 1
  },
  key2: {
  //......
  }
})

7.Object.getOwnPropertyDescriptor()
Object.getOwnPropertyDescriptor()方法可以获取对象属性描述符。该方法接收两个参数:属性所在的对象和要读取器描述符的属性名称。返回值是一个对象,更具具体的属性名称来决定是返回数据属性还是访问器属性。

上一篇 下一篇

猜你喜欢

热点阅读