双向绑定,也就是说js中的数据传到页面,页面中的内容到js,实现同步更新,简单的演示可以直接复制下放HTML代码运行。

在这个例子中,我们使用defineProperty ,Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。详细信息可以自行查看MDN文档。

简单来说,defineProperty 就是一个监听器,监听对象中某一个属性被访问和修改,在Vue2.0中就是采用defineProperty

注意事项

  1. 在使用get函数监听属性的时候,不能直接监听当前属性,否则会出现死循环。所以在使用前我将对象进行浅拷贝的原因
  2. 每一个defineProperty只能对一个对象属性进行监听,所以你必须在使用之前就得知道属性的名字,但是很多时候属性是动态生成的,,所以就很麻烦。
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head> <body> <h1 id="hname"></h1>
<input type="text" id="inputname">
</body> <script>
let stu = {
name: ""
}
let newstu = { ...stu };//浅拷贝
//监听器
Object.defineProperty(stu, "name", {
get() {
return newstu.name;
},
set(val) {
if (val === newstu.name) return;
newstu.name = val;
doubleBind();
}
})
//将数据传到页面中
function doubleBind() {
document.querySelector("#hname").innerHTML = stu.name;
inputname.value = stu.name;//id可以直接使用
}
//输入框事件,将页面中数据返回
inputname.oninput = function () {
stu.name = inputname.value;
}
doubleBind()
setTimeout(() => {
stu.name = "Mary";
}, 1000)
</script> </html>

defineProperty的弊端很明显,在ES6中提出了Proxy, 在Vue3.0中也将使用Proxy代替defineProperty,在Proxy中,我们可以在监听整一个对象属性的变化。

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head> <body> <h1 id="hname"></h1>
<input type="text" id="inputname">
</body> <script>
let stu = {
name: "12354"
} //监听器处理函数 //监听器
stu = new Proxy(stu, {
get(target, prop) { return target[prop];
},
set(target, prop,val){
if (val === target.prop) return;
target[prop] = val;
doubleBind();
}
});
//将数据传到页面中
function doubleBind() {
document.querySelector("#hname").innerHTML = stu['name'];
inputname.value = stu['name'];//id可以直接使用
}
//输入框事件,将页面中数据返回
inputname.oninput = function () {
stu['name'] = inputname.value;
}
doubleBind()
setTimeout(() => {
stu['name'] = "Mary";
console.log(stu);
}, 1000)
</script> </html>

对比两个例子,眼尖的friend会发现,第一个例子中我访问对象属性使用的是stu.name,而在第二个例子中使用的是stu['name']的方式。在《javascript高级程序设计》

引用类型的那一章提到:一般来说,访问对象属性时使用的都是点表示法,这也是很多面向对象语言中通用的语法。不过,

在 JavaScript 也可以使用方括号表示法来访问对象的属性。除非必须使用变量来访问属性,否则我们建议使用点表示法。在我们第二个例子Proxy中,prop是一个变量,所以我们使用方括号。特别要注意,stu.name和stu[name]是不一样的,当然如果有外部变量name=“name“,就一样了

最后

想要学习java基础或者进阶java 的同学私信回复 资料

领取一线大厂Java面试题总结+阿里巴巴泰山手册+各知识点学习思维导+一份300页pdf文档的Java核心知识点总结!

这些资料的内容都是面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。

最新文章

  1. (转)SVN服务器搭建和使用(三)
  2. tomcat配置SSL证书(使用startSSL申请到的证书)
  3. Php output buffering缓存及程序缓存
  4. 20 个超酷的 HTML5/CSS3 应用及源码
  5. 如何打开&ldquo;USB调试&rdquo;模式?
  6. Xcode编译项目出现访问private key提示框
  7. SED修改指定行
  8. 如何在Eclipse和MyEclipse中安装SVN
  9. com.android.ide.common.process.PrecessException:org.gradle.process....finished with non-zero exit value 1
  10. 我的iOS博客旅行开始了,欢迎光临!
  11. DB Query Analyzer 5.05 is released, 65 articles concerned have been published
  12. 《重构》的读书笔记&ndash;方法列表
  13. Luogu4655 [CEOI2017]Building Bridges
  14. 树莓派的系统安装,并且利用网线直连 Mac 进行配置
  15. Hadoop生态集群YARN详解
  16. U-Boot Makefile分析(3) rules.mk分析
  17. 文件IO模型
  18. vim技巧3
  19. java.net.NoRouteToHostException
  20. 百度网盘 http://pandownload.com/index.html

热门文章

  1. Python 中的元类到底是什么?这篇恐怕是最清楚的了
  2. METS介绍
  3. windows 创建python独立开发环境
  4. WSL配置高翔vslam环境
  5. python中的守护线程
  6. 网页开发中利用CSS以图换字的多中实现方法总汇
  7. c++随机生成树
  8. HashMap等集合初始化时应制定初始化大小
  9. drf请求、响应与视图
  10. 百万级别数据Excel导出优化