0%

Object.defineProperty 的基本使用

参考文档:Object.defineProperty

一,语法

1
Object.defineProperty(obj, prop, desc)
参数 说明
obj 需要定义属性的当前对象
prop 当前需要定义的属性名
desc 属性描述符

二,示例

1
2
3
4
5
6
7
8
9
10
let obj = {};
Object.defineProperty(obj, 'a', {
value : 20,
writable : true,
enumerable : true,
configurable : true,
get() {},
set() {}
});
console.log(obj.a); // 20
参数 说明
value 属性的初始化值
writeble 是否可修改值的内容
enumerable 是否可枚举,默认为false
configurable 是否可删除,默认为false
get 在读取属性时调用的函数,默认值为undefined
set 在写入属性时调用的函数,默认值为undefined

三,writeble 属性

当writable属性设置为false时,该属性被称为“不可写”。它不能被重新分配。

默认为 false,如下:

1
2
3
4
5
6
7
let obj = {};
obj.a = 10;
console.log(obj.a); // 10
Object.defineProperty(obj, 'b', {});
console.log(obj.b); // undefined
obj.b = 20
console.log(obj.b) // undefined

设置为 true,如下:

1
2
3
4
5
6
7
let obj = {};
obj.a = 10;
console.log(obj.a) // 10
Object.defineProperty(obj, 'b', { writable: true });
console.log(obj.b) // undefined
obj.b = 20
console.log(obj.b) // 20

四,enumerable 属性

默认为 false

enumerable 定义了对象的属性是否可以在 for…in 循环和 Object.keys() 中被枚举。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let obj = {};
Object.defineProperty(obj, 'a', { enumerable: false });
Object.defineProperty(obj, 'b', { enumerable: true });
Object.defineProperty(obj, 'c', {});
obj.d = null; // 直接赋值时, enumerable 为 true

// ------ for...in ------
let arr = [];
for (let i in obj) {
arr.push(i);
}
console.log(arr); // ["b", "d"]

// ------ Object.keys() ------
let keys = Object.keys(obj);
console.log(keys); // ["b", "d"]

五,configurable 属性

configurable 特性表示对象的属性是否可以被删除,以及除value和writable特性外的其他特性是否可以被修改。

默认为 false,如下:

1
2
3
4
5
6
7
8
9
10
let obj = {};
Object.defineProperty(obj, 'a', {
configurable: false,
get() {
return 123;
}
});
console.log(obj.a); // 123
delete obj.a;
console.log(obj.a); // 123

设置为 true,如下:

1
2
3
4
5
6
7
8
9
10
let obj = {};
Object.defineProperty(obj, 'a', {
configurable: true,
get() {
return 123;
}
});
console.log(obj.a); // 123
delete obj.a;
console.log(obj.a); // undefined

六,一般的 Setters 和 Getters

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function fn (args) {
Object.defineProperty(this, 'myproperty', {
get() {
return args;
},
set(res) {
this.val = res;
}
})
}
let _fn = new fn('get');
let myproperty = _fn.myproperty;
console.log(myproperty); // get
_fn.myproperty = 'set';
let val = _fn.val;
console.log(val); // set

七,添加多个属性和默认值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
let obj = {};

obj.a = 1;
// 等同于
Object.defineProperty(obj, 'a', {
value: 1,
writable: true,
enumerable: true,
configurable: true
});

Object.defineProperty(obj, 'b', { value: 2 });
// 等同于
Object.defineProperty(obj, 'a', {
value: 1,
writable: false,
enumerable: false,
configurable: false
});