Javascript中的getter和setter初识


Posted in Javascript onAugust 17, 2017

前言

本文主要给大家介绍的关于Javascript中getter和setter的相关内容,第一次听说这个东西的时候是vue.js里面的数据绑定,只要绑定了数据,修改对象属性可以自动反馈到dom上,很神奇,后面也看到了文档里面实现是对对象定义了getter和setter并覆盖原属性,索性就来总结这两者的用法,下面话不多说了,来一起看看详细的介绍吧。

原理

利用Object.defineProperty来重写对象属性为getter和setter,通过getter和setter顺便改变绑定DOM节点的值

例子

摘自MDN

function Archiver() {
 var temperature = null;
 var archive = [];

 Object.defineProperty(this, 'temperature', {
  get: function() {
   console.log('get!');
   return temperature;
  },
  set: function(value) {
   temperature = value;
   archive.push({ val: temperature });
  }
 });

 this.getArchive = function() { return archive; };
}

var arc = new Archiver();
arc.temperature; // 'get!'
arc.temperature = 11;
arc.temperature = 13;
arc.getArchive(); // [{ val: 11 }, { val: 13 }]

利用这个MDN例子小小的写了个方法并写了个计时器的DEMO

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <h1 id="testTime" z:bind="time">0s</h1>
<script>

  // 双向绑定
  function bind_data(ele, arg){
    var bindAttributeName = 'z:bind';
    var data = JSON.parse(JSON.stringify(arg)) || {};
    Object.keys(arg).forEach(function(argKey, index, array){
      Object.defineProperty(arg, argKey, {
        get: function(){
          return data[argKey];
        },
        set: function(value){
          if(ele.getAttribute(bindAttributeName) !== argKey) {
            return;
          }
          if(ele.tagName === 'INPUT'){
            ele.value = value;
          }else{
            ele.innerHTML = value;
          }
          data[argKey] = value;
        }
      });
      arg[argKey] = arg[argKey];
    });
    var key = ele.getAttribute(bindAttributeName);
    if((ele.tagName === 'INPUT' || ele.tagName === 'TEXTAREA') && arg[key]){
      ele.addEventListener('input', function(e){
        data[key] = ele.value;
      });
    }
  }


  /*
  例子很简单,直接改变对象属性,就直接
  反馈到了DOM上,就好像是一个钩子,改变
  这个对象的属性,这个属性的钩子把它绑
  定的DOM的数据进行修改
   */ 
  var start = (new Date()).getTime();
  var now;
  var b = {time: '0s'};
  bind_data(document.getElementById('testTime'), b);
  setInterval(function(){
    var now = (new Date()).getTime();
    b.time = ((now - start)/1000) + 's'
  }, 1);

</script>
</body>
</html>

参考

Object.defineProperty() - JavaScript | MDN

深入响应式原理 — Vue.js

总结

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

Javascript 相关文章推荐
List the Codec Files on a Computer
Jun 18 Javascript
JavaScript 继承使用分析
May 12 Javascript
js给onclick赋值传参数的两种方法
Nov 25 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
Feb 10 Javascript
JS实现的车标图片提示效果代码
Oct 10 Javascript
使用Node.js实现简易MVC框架的方法
Aug 07 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
Dec 27 Javascript
关于微信公众号开发无法支付的问题解决
Dec 28 Javascript
使用webpack搭建pixi.js开发环境
Feb 12 Javascript
JS前端模块化原理与实现方法详解
Mar 17 Javascript
Angular利用HTTP POST下载流文件的步骤记录
Jul 26 Javascript
js实现淘宝浏览商品放大镜功能
Oct 28 Javascript
简单实现js进度条加载效果
Mar 25 #Javascript
你可能不知道的JSON.stringify()详解
Aug 17 #Javascript
vue组件Prop传递数据的实现示例
Aug 17 #Javascript
js实现随机点名小功能
Aug 17 #Javascript
浅谈Vuejs Prop基本用法
Aug 17 #Javascript
简单快速的实现js计算器功能
Aug 17 #Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
Aug 17 #jQuery
You might like
浅析php中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
PHP mkdir()无写权限的问题解决方法
2014/06/19 PHP
PHP SESSION跨页面传递失败解决方案
2020/12/11 PHP
javascript XML数据显示为HTML一例
2008/12/23 Javascript
js客户端快捷键管理类的较完整实现和应用
2010/06/08 Javascript
Extjs优化(一)删除冗余代码提高运行速度
2013/04/15 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
JavaScript检测上传文件大小的方法
2015/07/22 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
关于js中的鼠标事件总结
2017/07/11 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
CryptoJS中AES实现前后端通用加解密技术
2018/12/18 Javascript
vue - props 声明数组和对象操作
2020/07/30 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
Python Queue模块详解
2014/11/30 Python
Python基础教程之正则表达式基本语法以及re模块
2016/03/25 Python
Python简单实现TCP包发送十六进制数据的方法
2016/04/16 Python
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
Python实现脚本锁功能(同时只能执行一个脚本)
2017/05/10 Python
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
Python中创建二维数组
2018/10/17 Python
Python两台电脑实现TCP通信的方法示例
2019/05/06 Python
python 解决mysql where in 对列表(list,,array)问题
2020/06/06 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
教师专业理论水平的自我评价分享
2013/11/09 职场文书
关于工资低的辞职信
2014/01/14 职场文书
英语自我评价范文
2014/01/24 职场文书
大学生军训广播稿
2014/01/24 职场文书
人事专员岗位职责范本
2014/03/04 职场文书
初中国旗下的演讲稿
2014/08/28 职场文书
mysql中int(3)和int(10)的数值范围是否相同
2021/10/16 MySQL
Python Pandas 删除列操作
2022/03/16 Python