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 相关文章推荐
JavaScript 动态添加表格行 使用模板、标记
Oct 24 Javascript
js简单的表格添加行和删除行操作示例
Mar 31 Javascript
Jquery中find与each方法用法实例
Feb 04 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
Jan 27 Javascript
JavaScript SweetAlert插件实现超酷消息警告框
Jan 28 Javascript
jquery把int类型转换成字符串类型的方法
Oct 07 Javascript
微信小程序 form组件详解
Oct 25 Javascript
如何阻止小程序遮罩层下方图层滚动
Sep 05 Javascript
KnockoutJS数组比较算法实例详解
Nov 25 Javascript
浅谈vant组件Picker 选择器选单选问题
Nov 04 Javascript
解决Antd Table表头加Icon和气泡提示的坑
Nov 17 Javascript
JavaScript parseInt0.0000005打印5原理解析
Jul 23 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
Zend引擎的发展 [15]
2006/10/09 PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
2011/06/10 PHP
php GUID生成函数和类
2014/03/10 PHP
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
jquery中的$(document).ready()与window.onload的区别
2009/11/18 Javascript
javascript或asp实现的判断身份证号码是否正确两种验证方法
2009/11/26 Javascript
js创建对象的几种常用方式小结(推荐)
2010/10/24 Javascript
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
JSON语法五大要素图文介绍
2012/12/04 Javascript
Windows系统中安装nodejs图文教程
2015/02/28 NodeJs
Vue.js组件使用开发实例教程
2016/11/01 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
vue.js路由跳转详解
2017/08/28 Javascript
vue插件开发之使用pdf.js实现手机端在线预览pdf文档的方法
2018/07/12 Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
2019/10/16 Javascript
layui 解决form表单点击无反应的问题
2019/10/25 Javascript
原生JS实现萤火虫效果
2020/03/07 Javascript
js实现3D旋转效果
2020/08/18 Javascript
[01:21]DOTA2新纪元-7.0新版本即将开启!
2016/12/11 DOTA
在Python中使用模块的教程
2015/04/27 Python
python hough变换检测直线的实现方法
2019/07/12 Python
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
荷兰优雅女装网上商店:Heine
2016/11/14 全球购物
意大利比基尼品牌:MISS BIKINI
2019/11/02 全球购物
文明宿舍获奖感言
2014/02/07 职场文书
销售会议开幕词
2015/01/28 职场文书
孝女彩金观后感
2015/06/10 职场文书
关于职业道德的心得体会
2016/01/18 职场文书
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js
各国货币符号大全
2022/02/17 杂记
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle