谈谈因Vue.js引发关于getter和setter的思考


Posted in Javascript onDecember 02, 2016

起因

当我打印出Vue实例下的data对象里的属性时,发现了一个有趣的事情:

谈谈因Vue.js引发关于getter和setter的思考

它的每个属性都有两个相对应的getset方法,我觉的这是多此一举的,于是去网上查了查Vue双向绑定的实现原理,才发现它和Angular.js双向绑定的实现原理完全不同,Angular是用的数据脏检测,当Model发生变化,会检测所有视图是否绑定了相关数据,再更改视图。而Vue使用的发布订阅模式,是点对点的绑定数据。

Vue的数据绑定只有两个步骤,compile=>link

我一直在想,vue是通过什么去监听用户对Model的修改,直到我发现Vue的data里,每个属性都有setget属性,我才明白过来。

在平时,我们创建一个对象,并修改它的属性,是这样的:

var obj = {
  val:99
 }
 obj.val = 100;
 console.log(obj.val)//100

没有任何问题,但是如果要你去监测,当我修改了这个对象的属性时,要去做一些事,你会怎么做?

相关思考

这就要用到gettersetter了。

假设我现在要给一个码农对象添加一个name属性,而且每次更新name属性时,我要去完成一些事,我们可以这样做:

var Coder = function() {
  var that = this;
  return {
   get name(){
    if(that.name){
     return that.name
    }
    return '你还没有取名'
   },
   set name(val){
    console.log('你把名字修成了'+val)
    that.name = val
   }
  }
 }
 var isMe = new Coder()
 console.log(isMe.name)
 isMe.name = '周神'
 console.log(isMe.name)
 console.log(isMe)

输出:

谈谈因Vue.js引发关于getter和setter的思考

你会发现这个对象和最上面的Vue中的data对象,打印出来的效果是一样的,都拥有getset属性。

我们来一步步分析下上面的代码,很有趣。

我们先创建一个对象字面量:

var Coder = function() {...}

再把this缓存一下:

var that = this;

接下来是最重要的,我们return了一个对象回去:

{

get name(){...},


set name(val){...}

}

顾名思义,get为取值,set为赋值,正常情况下,我们取值和赋值是用obj.prop的方式,但是这样做有一个问题,我如何知道对象的值改变了?所以就轮到set登场了。

你可以把getset理解为function,当然,只是可以这么理解,这是完全不一样的两个东西。

接下来创建一个码农的实例,isMe;此时,isMe是没有name属性的,当我们调用isMe.name时,我们会进入到get name(){...}中,先判断isMe是否有name属性,答案是否定的,那麽就添加一个name属性,并给它赋值:"你还没有取名";如果有name属性,那就返回name属性。

看到这里你一定知道get怎么使用了,对,你可以把get看成一个取值的函数,函数的返回值就是它拿到的值。

我感觉比较重要的是set属性,当我给实例赋值:

isMe.name="周神"

此时,会进入set name(val){...};形参val就是我赋给name属性的值,在这个函数里,我就可以做很多事了,比如双向绑定!因为这个值的每次改变都必须经过set,其他方式是改变不了它的,相当于一个万能的监听器。

还有另一种方法可以实现这个功能。

ES5的对象原型有两个新的属性__defineGetter____defineSetter__ ,专门用来给对象绑定get和set。

可以这样书写:

var Coder = function() {
 }
 Coder.prototype.__defineGetter__('name', function() {
  if (this.name) {
   return this.name
  }else{
   return '你还没有取名'
  }
 })
 Coder.prototype.__defineSetter__('name', function(val) {
  this.name = val
 })
 var isMe = new Coder()
 console.log(isMe.name)
 isMe.name = '周神'
 console.log(isMe.name)
 console.log(isMe)

效果是一样的,建议使用下面这种方式,因为是在原型上书写,所以可以继承和重用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
jQuery EasyUI API 中文文档 - Draggable 可拖拽
Sep 29 Javascript
精心挑选的15个jQuery下拉菜单制作教程
Jun 15 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
Nov 20 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
Oct 17 Javascript
JSON字符串转JSON对象
Jul 31 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
Mar 11 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
Jun 28 Javascript
js控住DOM实现发布微博效果
Aug 30 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
Jan 17 Javascript
vuejs响应用户事件(如点击事件)
Mar 14 Javascript
three.js利用射线Raycaster进行碰撞检测
Mar 12 Javascript
vant中的toast层级改变操作
Nov 04 Javascript
jquery获取input type=text中的值的各种方式(总结)
Dec 02 #Javascript
vue.js入门(3)——详解组件通信
Dec 02 #Javascript
javascript实现鼠标点击页面 移动DIV
Dec 02 #Javascript
jquery对所有input type=text的控件赋值实现方法
Dec 02 #Javascript
bootstrap使用validate实现简单校验功能
Dec 02 #Javascript
在网页中插入百度地图的步骤详解
Dec 02 #Javascript
PHP获取当前页面完整URL的方法
Dec 02 #Javascript
You might like
PHP面向对象编程快速入门
2006/12/14 PHP
php中对2个数组相加的函数
2011/06/24 PHP
php验证是否是md5编码的简单代码
2014/04/01 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
2018/03/12 PHP
window.addeventjs事件驱动函数集合addEvent等
2008/02/19 Javascript
Prototype中dom对象方法汇总
2008/09/17 Javascript
利用JQuery和JS实现奇偶行背景颜色自定义效果
2012/11/19 Javascript
前后台交互过程中json格式如何解析以及如何生成
2012/12/26 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
AngularJs动态加载模块和依赖注入详解
2016/01/11 Javascript
jQuery的三种bind/One/Live/On事件绑定使用方法
2017/02/23 Javascript
jquery mobile实现可折叠的导航按钮
2017/03/11 Javascript
微信小程序与php 实现微信支付的简单实例
2017/06/23 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
浅谈Vue数据响应思路之数组
2018/11/06 Javascript
微信小程序中data-key属性之数据传输(经验总结)
2020/08/22 Javascript
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[39:19]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第二场 11.26
2020/11/30 DOTA
Python的另外几种语言实现
2015/01/29 Python
解决django后台样式丢失,css资源加载失败的问题
2019/06/11 Python
Python的Tkinter点击按钮触发事件的例子
2019/07/19 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
2019/10/25 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
2020/04/27 Python
CSS3实现酷炫的3D旋转透视效果
2019/11/21 HTML / CSS
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
员工培训邀请函
2014/01/11 职场文书
幼儿园教师工作制度
2014/01/22 职场文书
创业者是否需要商业计划书?
2014/02/07 职场文书
和谐家庭演讲稿
2014/05/24 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
2015年前台接待工作总结
2015/05/04 职场文书
组织委员竞选稿
2015/11/21 职场文书
Python基于Tkinter开发一个爬取B站直播弹幕的工具
2021/05/06 Python
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL
css3 文字断裂效果
2022/04/22 HTML / CSS