Object.defineProperty的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性
Object.defineProperty(对象, 属性名称, 属性描述)
- 给obj定义一个属性a的值为1
let obj = {}
Object.defineProperty(obj, 'a', { value: 1 })
console.log(obj) // {a: 1}
- writable表示目标属性是否可以被重新赋值
writable【顾名思义属性是否可以被重新赋值】接受数据类型为 boolean;writable默认为false,所以无法更改
let obj = {}
Object.defineProperty(obj, 'a', { value: 1 })
obj.a = 2
console.log(obj) // {a: 1}
想让属性a可以更改,则需要把writable变为true
let obj = {}
Object.defineProperty(obj, 'a', { value: 1, writable: true })
obj.a = 2
console.log(obj) // {a: 2}
- enumerable表示目标属性是否可以被枚举
enumerable表示目标属性是否可以被枚举,默认为false
let obj = {}
Object.defineProperty(obj, 'a', { value: 1 })
console.log(Object.keys(obj)) // []
这里因为enumerable默认是false,所以这边无法被枚举,如果要想能被枚举则需要把enumerable改为true
let obj = {}
Object.defineProperty(obj, 'a', { value: 1, enumerable: true })
console.log(Object.keys(obj)) // ['a']
- configurable表示目标属性是否可以被删除
configurable表示目标属性能否被删除,默认是false,不可以被删除
let obj = {}
Object.defineProperty(obj, 'a', { value: 1 })
delete obj.a
console.log(obj) // {a: 1}
把configurable变为true,则就可以删除
let obj = {}
Object.defineProperty(obj, 'a', { value: 1, configurable: true })
delete obj.a
console.log(obj) // {}
- get: 目标属性获取值的方法
let obj = {}
Object.defineProperty(obj, 'a', {
get: function () {
console.log("数据被获取了!!!")
return 123
}
})
console.log(obj.a)
输出结果:
数据被获取了!!!
123
- set: 目标属性设置值的方法
let obj = {}
Object.defineProperty(obj, 'a', {
set: function (val) {
console.log("设置值了:", val);
}
})
obj.a = 123
输出结果:
设置值了: 123
切记:当使用了get或set方法,不允许使用writable和value这两个属性(如果使用,会直接报错滴)
- getOwnPropertyDescriptor获取对象的某个属性的描述
let obj = {
a: 123
}
let des = Object.getOwnPropertyDescriptor(obj, 'a')
console.log(des)
// {value: 123, writable: true, enumerable: true, configurable: true}
总结:
-
value: 设置属性的值
-
writable: 值是否可以重写; boolean类型,默认false
-
enumerable: 目标属性是否可以被枚举; boolean类型,默认false
-
configurable: 目标属性是否可以被删除或是否可以再次修改特性; boolean类型,默认false
-
set: 目标属性设置值的方法
-
get: 目标属性获取值的方法
-
当使用了get或set方法,不允许使用writable和value这两个属性(如果使用,会直接报错滴)
-
获取对象某个属性描述getOwnPropertyDescriptor