<!DOCTYPE html>
<html lang="en">
<head>

<meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>

</head>
<body>

<h1 id="h1"></h1><input type="text" id="input"><button id="button">change</button><script>    var data = {        msg : "我是一个数据"    }    // 页面上的初始化    h1.innerText = data.msg    input.value = data.msg    // 数据劫持 , 这个api可以对一个对象的属性进行精确的控制    // 控制这个属性能够被赋值 能够被重写 能否被获取    // 控制这个属性的读取 或者 写入     // get/set     // get 获取值  或者叫 读取    // set 设置值  或者叫 赋值    Object.defineProperty(data,"msg",{        get(){            // 当我获取msg的值的时候 我希望获取到的是什么结果呢?            return input.value        },        set(newValue){            // 当我给msg属性赋值的时候 我希望做一些事情            // data.msg ="咳咳"            // 因为要模拟双向数据绑定 那么得到的新的值 input与h1中的内容也要跟新的值一致            // 实际上在vue的底层这一步是通过观察者 / 订阅者模式实现            h1.innerText = newValue;            input.value = newValue        }    })    button.onclick = function(){        data.msg += 1    }    input.onkeyup = function(){        // 当键盘抬起的时候 我们让 data.msg 获取新的值 也就是对data.msg 重新赋值        data.msg = input.value        console.log(data.msg)    }</script>

</body>
</html>