# 基础知识准备

# Object.defineProperty

Vue的响应式系统就是基于访问器描述符实现的

# 参数

Object.defineProperty(obj, prop, descriptor)

参数 说明
obj 定义的对象
prop 定义的对象的属性
descriptor 定义的对象的属性的描述符

# 返回值

定义的对象

# 描述符

描述符有两种:数据描述符和访问器描述符, 两者不能共存

# 描述符共有的属性设置

属性 说明 默认值
enumerbale 枚举属性 false
configurable 属性的描述符是否可被修改,属性是否可从对象上删除 false

# 数据描述符

属性 说明 默认值
writable 可写属性 false
value 该属性的值 undefined

# 访问器描述符

属性 说明 默认值
get 访问该属性的时候回调用该函数 undefined
set 设置该属性的时候会调用该函数 undefined

# 例子

<!DOCTYPE html>
<html lang="en">
<script>
  console.log('--------------数据描述符-----------------');
  const obj = {
    name: 'xm'
  }
  Object.defineProperty(obj, 'name', {
    enumerable: false,
    writable: true,
    configuable: true,
    value: 'xh'
  })

  console.log('@@@obj', obj.name); // @@@ob xh


  console.log('--------------访问器描述符-----------------');

  const countObj = {
    count: 1
  }
  function defineReactive(target, key, value) {
    Object.defineProperty(target, key, {
      get() {
        console.log('countObj get', value) // countObj get 3

        return value;
      },
      set(newValue) {
        console.log('newVal', newValue); // 3
        value = newValue;
      }
    })
  }
  defineReactive(countObj, 'count', 1);
  countObj.count = 3;
  countObj.count;
</script>
</html>

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
35
36
37
38
39
40
41