JavaScript 对象高级
defineProperty
Object.defineProperty 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
js
Object.defineProperty(obj, prop, descriptor)
// obj为要定义属性的对象
// prop为要定义或修改的属性名称
// descriptor则为该属性的描述符属性描述符
数据属性描述符
Configurable:表示属性是否可以通过 delete 删除属性,是否可以修改它的特性,或者是否可以将它修改为存取属性描述符;
- 当我们直接在一个对象上定义某个属性时,这个属性的
Configurable为 true; - 当我们通过属性描述符定义一个属性时,这个属性的
Configurable默认为 false;
Enumerable:表示属性是否可以通过 for-in 或者 Object.keys() 返回该属性;
- 当我们直接在一个对象上定义某个属性时,这个属性的
Enumerable为 true; - 当我们通过属性描述符定义一个属性时,这个属性的
Enumerable默认为 false;
Writable:表示是否可以修改属性的值;
- 当我们直接在一个对象上定义某个属性时,这个属性的
Writable为 true; - 当我们通过属性描述符定义一个属性时,这个属性的
Writable默认为 false;
value:属性的 value 值,读取属性时会返回该值,修改属性时,会对其进行修改;
- 默认情况下这个值是
undefined;
存取属性描述符
get:获取属性时会执行的函数。默认为 undefined
set:设置属性时会执行的函数。默认为 undefined
defineProperties
Object.defineProperties 方法直接在一个对象上定义 多个 新的属性或修改现有属性,并且返回该对象。
js
const obj = {
_age: 18,
}
Object.defineProperties(obj, {
name: {
writable: true,
value: 'me',
},
age: {
get: function () {
return this._age
},
},
})keys、 values、entries
Object.keys 获取一个对象所有可枚举字符串的 key
Object.values 获取所有可枚举字符串属性的 value 值
Object.entries 返回一个数组,包含给定对象自有的可枚举字符串键属性的键值对。
注意
以上都是针对字符串键,若是 Symbol 键则无效
其它方法补充
获取对象的属性描述符:
禁止对象扩展新属性:preventExtensions
- 给一个对象添加新的属性会失败(在严格模式下会报错);
密封对象,不允许配置和删除属性:seal
- 实际是调用 preventExtensions
- 并且将现有属性的 configurable: false
冻结对象,不允许修改现有属性: freeze
- 实际上是调用 seal
- 并且将现有属性的 writable: false

