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 相关文章推荐
js类 from qq
Nov 13 Javascript
js几个验证函数代码
Mar 25 Javascript
jquery $(&quot;#variable&quot;) 循环改变variable的值示例
Feb 23 Javascript
jQuery圆形统计图开发实例
Jan 04 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
Oct 10 Javascript
星期几的不同脚本写法(推荐)
Jun 01 Javascript
js从外部获取图片的实现方法
Aug 05 Javascript
JS获取当前页面名称的简单实例
Aug 19 Javascript
快速入门Vue
Dec 19 Javascript
DWR3 访问WEB元素的两种方法实例详解
Jan 03 Javascript
微信小程序canvas拖拽、截图组件功能
Sep 04 Javascript
vue-form表单验证是否为空值的实例详解
Oct 29 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采集相关教程之一 CURL函数库
2010/02/15 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
php校验表单检测字段是否为空的方法
2015/03/20 PHP
php递归遍历删除文件的方法
2015/04/17 PHP
php+ajax 文件上传代码实例
2019/03/18 PHP
csdn 博客的css样式 v3
2009/02/24 Javascript
jQuery层次选择器选择元素使用介绍
2013/04/18 Javascript
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
jQuery实现自定义下拉列表
2015/01/05 Javascript
JavaScript运动减速效果实例分析
2015/08/04 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
2016/11/29 Javascript
JavaScrpt判断一个数是否是质数的实例代码
2017/06/11 Javascript
vue表单绑定实现多选框和下拉列表的实例
2017/08/12 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
vue-cli2 构建速度优化的实现方法
2019/01/08 Javascript
创建nuxt.js项目流程图解
2020/03/13 Javascript
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
使用python解析xml成对应的html示例分享
2014/04/02 Python
Python打包可执行文件的方法详解
2016/09/19 Python
基于python中staticmethod和classmethod的区别(详解)
2017/10/24 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
2020/02/20 Python
pyqt5中动画的使用详解
2020/04/01 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
2021/01/01 Python
高级3D打印市场:Gambody
2019/12/26 全球购物
什么是三层交换,说说和路由的区别在那里
2014/09/01 面试题
房屋继承公证书
2014/04/10 职场文书
2015年班主任个人工作总结
2015/03/31 职场文书
小学教师岗位职责
2015/04/02 职场文书
2016年党员干部公开承诺书
2016/03/24 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书
关于Python中进度条的六个实用技巧分享
2022/04/05 Python