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 相关文章推荐
列表内容的选择
Jun 30 Javascript
让广告代码不再影响你的网页加载速度
Jul 07 Javascript
Jquery升级新版本后选择器的语法问题
Jun 02 Javascript
javascript制作loading动画效果 loading效果
Jan 14 Javascript
Bootstrap项目实战之子栏目资讯内容
Apr 25 Javascript
浅谈JavaScript中小数和大整数的精度丢失
May 31 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
Mar 02 Javascript
详解angularjs获取元素以及angular.element()用法
Jul 25 Javascript
Angular网络请求的封装方法
May 22 Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
Mar 19 Javascript
vue基于viewer实现的图片查看器功能
Apr 12 Javascript
js实现打字小游戏
Dec 17 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基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
thinkphp实现上一篇与下一篇的方法
2014/12/08 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
JSON字符串传到后台PHP处理问题的解决方法
2016/06/05 PHP
jQuery技巧总结
2011/01/01 Javascript
JavaScript中Math对象方法使用概述
2014/01/02 Javascript
JS合并数组的几种方法及优劣比较
2014/09/19 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
JavaScript从0开始构思表情插件
2016/07/26 Javascript
AngularJS指令详解及示例代码
2016/08/16 Javascript
Webpack+Vue如何导入Jquery和Jquery的第三方插件
2017/02/20 Javascript
Express之get,pos请求参数的获取
2017/05/02 Javascript
深入理解Vue官方文档梳理之全局API
2017/11/22 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
详解vue页面首次加载缓慢原因及解决方案
2019/11/06 Javascript
Python中文编码那些事
2014/06/25 Python
Python中optionParser模块的使用方法实例教程
2014/08/29 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
2014/11/28 Python
Python比较两个图片相似度的方法
2015/03/13 Python
python实现斐波那契数列的方法示例
2017/01/12 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
python使用udp实现聊天器功能
2018/12/10 Python
python打包成so文件过程解析
2019/09/28 Python
pandas实现DataFrame显示最大行列,不省略显示实例
2019/12/26 Python
python 解压、复制、删除 文件的实例代码
2020/02/26 Python
西班牙拥有最佳品牌的动物商店:Animalear.com
2018/01/05 全球购物
Everlast官网:拳击、综合格斗和健身相关的体育用品
2020/08/03 全球购物
旅行社各个岗位职责
2014/03/15 职场文书
事业单位绩效考核实施方案
2014/03/27 职场文书
快餐公司创业计划书
2014/04/29 职场文书
精彩的演讲稿开头
2014/05/08 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
六年级小学生评语
2014/12/26 职场文书
刮痧观后感
2015/06/05 职场文书
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js
MySQL如何使备份得数据保持一致
2022/05/02 MySQL