Object.defineProperty() 和 Proxy 对象,都可以用来对数据的劫持操作。
何为数据劫持呢?就是在我们访问或者修改某个对象的某个属性的时候,通过一段代码进行拦截行为,然后进行额外的操作,然后返回结果。那么vue中双向数据绑定就是一个典型的应用。
Vue2.x 是使用 Object.defindProperty(),来进行对对象的监听的。
Vue3.x 版本之后就改用Proxy进行实现的。
示例代码
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
| <!doctype html> <html lang="zh-CN"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Object.defineProperty 及 实现数据双向绑定</title> <input type="text" /> <h1></h1> </head>
<body> <script> const ipt = document.querySelector("input"); const h = document.querySelector("h1"); let hanObj = { name: "", _name: "", }; Object.defineProperty(hanObj, "name", { get() { return hanObj._name; }, set(sval) { hanObj._name = sval; h.innerHTML = sval; ipt.value = sval; }, }); ipt.oninput = function () { hanObj.name = this.value; }; </script> </body> </html>
|