JavaScript中Object总结
前言
本篇文章用来记录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
})
注意一下几点:
- 当把configurable设为false后,就不可在设回可配置状态。此时,调用Object .defineProperty()方法修改除了writable之外的特性,都会报错。
- 在使用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()方法可以获取对象属性描述符。该方法接收两个参数:属性所在的对象和要读取器描述符的属性名称。返回值是一个对象,更具具体的属性名称来决定是返回数据属性还是访问器属性。