7_vue的数据代理,双向绑定

回顾 object.defineProperty() 方法
区别defineProperty == 给对象定义属性用的
需要传递三个基本参数

  1. 需要定义属性的对象名
  2. 你要定义的属性叫什么名字(比如给person这个实体添加一个age属性)
  3. 配置项(对象类型的参数,里面存放键值对)

7_vue的数据代理,双向绑定

文章插图
<script>// 创建一个对象,该对象有两个基本属性var person = {name:"张三",sex:"男"}// 为person对象添加属性// 1、给那个对象添加?// 2、添加的属性名是什么?// 3、这个属性的基础配置项(对象类型,键值对形式)Object.defineProperty(person,"age",{value:18, // 该属性的值是})</script>需求1
  • 给 对象person,添加一个属性age , 有几种方式?
  • 三种
    1. 直接在 person对象当中添加属性;该属性值可以修改

      • 7_vue的数据代理,双向绑定

        文章插图
    2. 通过 .属性;对其设置;该属性值可以修改

      • 7_vue的数据代理,双向绑定

        文章插图
    3. 通过 Object.finedProperty()进行添加;该属性值不可枚举(不可修改) 默认情况下

      • 7_vue的数据代理,双向绑定

        文章插图
不可枚举性通过 defineProperty添加的属性
7_vue的数据代理,双向绑定

文章插图
如果不设置配置项 , 那么该属性是不可枚举的;在控制台中可以看到 , 颜色变浅了
7_vue的数据代理,双向绑定

文章插图
该属性不参与遍历 , 我们可以测试下
7_vue的数据代理,双向绑定

文章插图
基本配置项value最开始配置的
7_vue的数据代理,双向绑定

文章插图
enumerable
7_vue的数据代理,双向绑定

文章插图
Object.defineProperty(person,"age",{value:18, // 该属性的值是enumerable:true, // 该配置项控制添加的属性是否参与枚举})writable设置属性是否可以被修改
7_vue的数据代理,双向绑定

文章插图
configurable控制属性是否可以被删除
没有通过函数添加age属性的person对象
7_vue的数据代理,双向绑定

文章插图
通过函数添加age属性的person对象删除属性
7_vue的数据代理,双向绑定

文章插图
设置配置项删除掉age属性
7_vue的数据代理,双向绑定

文章插图
需求2
  • 准备一个变量 number,值为18
  • person当中有一个age属性,这个属性的value 是 number(不是手写的18)

7_vue的数据代理,双向绑定

文章插图
问题所在
  • 这个变量的值可能会发生改变,如果呢?

    • 7_vue的数据代理,双向绑定

      文章插图
  • 修改number , person对象当中的age值并没有发生改变
  • 同理,修改age,number也不会发生改变
这俩好像有点关系,但好像又没有关系,就js代码加载的时候这俩自顶而下有了这一层关系,但也仅仅只有这一层
7_vue的数据代理,双向绑定

文章插图
那怎么完成这个需求呢?
7_vue的数据代理,双向绑定

文章插图
请看下方的高级配置项
高级配置项get(getter)配置项
7_vue的数据代理,双向绑定

文章插图
解析
  1. 它的数据类型是一个对象
  2. 当 有人读取 person当中的age属性的时候,get就会被调用
  3. 且get的返回值就是age 的 value值
  4. 自定义get(getter函数)的时候,不能再使用基础配置了

    • 7_vue的数据代理,双向绑定

      文章插图
那 返回一个 waves 字符串吧
7_vue的数据代理,双向绑定

文章插图
三个点儿
  1. invoke:映射
  2. property:属性
  3. getter:get配置项 == 函数