语法
-
Object.defineProperty(obj, prop, descriptor)
- obj: 要操作的对象
- prop: 要操作的对象的属性名字
- descriptor: 官方文档给的名字是描述符,我更喜欢叫他为配置对象
-
descriptor配置对象中的所有参数
参数 | 默认值 | 作用 | 配置属性 | 存取数据 |
---|---|---|---|---|
configurable | false | 为true时,以后才能修改属性(prop)的配置 | ✔ | ✔ |
enumerable | false | 为true时,才可以枚举 | ✔ | ✔ |
writable | false | 为true时,才可以修改属性的值 | ✔ | ✗ |
value | undefined | 任何有效值(字符串、函数等) | ✔ | ✗ |
get | undefined | 是一个函数,如果读取该属性触发,会有返回值 | ✗ | ✗ |
set | undefined | 是一个函数,如果设置该属性触发 | ✗ | ✗ |
解释
- 配置属性、存取数据打勾打叉的意思就是不能同时存在,比如你写了get和set,就不能写writable属性的意思。
例子
/**
* @Auther: kjprime
* @Date: 2022/8/2
* @Description: Object.defineProperty例子
* @version: 1.0.0
*/
const obj1 = {"name": "kjprime"}
// 配置属性
Object.defineProperty(obj1, "name", {
configurable: true,
enumerable: true,
writable: false,
value: "KjPrime"
})
console.log("obj1.name:", obj1.name)
const obj2 = {"name": "kjprime"}
// 存取数据
Object.defineProperty(obj2, "name", {
configurable: true,
enumerable: true,
get(){
console.log("我在访问obj2.name的数据,我给他返回我自定义的值")
return "obj2自定义的值"
},
set(value){
console.log("我在修改obj2.name的数据,把它修改成:", value)
}
})
console.log(obj2.name)
obj2.name = "KjPrime"
console.log(obj2.name)