用于对象定义属性,修改和获取属性值。

对象的定义与赋值

经常使用的定义与赋值方法 obj.prop =value 或者 obj[‘prop’]=value

Object.defineProperty()语法说明

Object.defineProperty()的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性。

1
2
3
4
5
Object.defineProperty(obj, prop, desc);

// obj 需要定义属性的当前对象
// prop 当前需要定义的对象键
// desc 属性描述符

一般通过为对象的属性赋值的情况下,对象的属性可以修改也可以删除,但是通过 Object.defineProperty()定义属性,通过描述符的设置可以进行更精准的控制对象属性。
desc 属性描述符:

  • value
    • 定义属性的值,对象没有这个属性会添加。
  • writable
    • 默认为 false,表示该属性不能被修改;true 表示可以修改。
  • configuable
    • 默认为 false,不可删除
    • 属性是否可以删除。
    • 属性的特性在第一次定义完后可否被重新定义特性。
  • get
    • function 获取属性值时调用
  • set
    • function 设置属性值时调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function convert(obj) {
for (let key in obj) {
let inter = obj[key];
Object.defineProperty(obj, key, {
get() {
console.log("obj get " + key + " = " + inter);
return inter;
},
set(value) {
inter = value;
console.log(`obj set ${key} = ${inter}`);
},
});
}
}

let obj = { a: 1, b: 2, c: 3 };
convert(obj);
obj.a = 456; // obj set a = 456
console.log(obj.c); // obj get c = 3 , 3

let obj2 = { name: "zs", age: 20, sex: "nan" };
console.log(obj2); // { name: 'zs', age: 20, sex: 'nan' }
convert(obj2);
obj2.a = 1;
console.log(obj2);
// {name: [Getter/Setter],age: [Getter/Setter],sex: [Getter/Setter],a: 1}
console.log(obj2.age); // obj get age = 20 , 20
console.log(obj2.a); // 1