属性描述符
属性描述符配置参考 MDNopen in new window
Object.defineProperty()
语法:Object.defineProperty(obj, prop, descriptor)
参数:
obj
要定义属性的对象。
prop
要定义或修改的属性的名称
descriptor
要定义或修改的属性描述符。
属性描述符:它表达了一个属性的相关信息(元数据),它本质上是一个对象。
数据属性
存取器属性:
当给它赋值时,会自动运行一个函数。
当获取它的值时,会自动运行一个函数。
var obj = {}
Object.defineProperty(obj, 'x', {
// 属性描述符
get: function () {
// 当读取属性时,运行的函数
console.log('读取属性x')
// 该函数的返回值,将作为属性值
return 2
},
set: function (val) {
// 当给属性赋值时,运行的函数
// val:表示要赋的值
console.log('给属性赋值为' + val)
},
})
obj.x = 3 // 相当于运行了 set(3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
例子:
function User(name, age) {
this.name = name
// 年龄的范围取值:0~100
// 如果年龄的取值小于了0,则赋值为0;如果年龄的值大于了100,则赋值为100。
var _age
Object.defineProperty(this, 'age', {
get: function () {
console.log('运行了age的get')
return _age
},
set: function (val) {
console.log('运行了age的set:' + val)
if (val < 0) {
val = 0
} else if (val > 100) {
val = 100
}
_age = val
},
})
this.age = age
}
var u = new User('abc', -1)
u.age = user.age + 10000
console.log(u.age)
// 上面代码执行结果:
// 运行了age的set:-1
// 运行了age的get
// 运行了age的set:10000
// 运行了age的get
// 100
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
30
31
32
33
34
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
30
31
32
33
34
Object.getOwnPropertyDescriptor()
返回指定对象上一个自有属性对应的属性描述符。
语法:Object.getOwnPropertyDescriptor(obj, prop)
参数:
obj
需要查找的目标对象
prop
目标对象内属性名称