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吗?
Feb 24 Javascript
javascript window.confirm确认 取消对话框实现代码小结
Oct 21 Javascript
javascript面向对象包装类Class封装类库剖析
Jan 24 Javascript
node.js中Socket.IO的进阶使用技巧
Nov 04 Javascript
JS实现队列与堆栈的方法
Apr 21 Javascript
Node.js 实现简单小说爬虫实例
Nov 18 Javascript
微信小程序 form组件详解及简单实例
Jan 10 Javascript
js 判断数据类型的几种方法
Jan 13 Javascript
angularjs通过过滤器返回超链接的方法
Oct 26 Javascript
详解Vue-axios 设置请求头问题
Dec 06 Javascript
关于vue-cli3打包代码后白屏的解决方案
Sep 02 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
Dec 01 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中用于检测一个地理IP地址是否可用的代码
2012/02/19 PHP
PHP json_encode中文乱码问题的解决办法
2013/09/09 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
php使用GD2绘制几何图形示例
2017/02/15 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
php+websocket 实现的聊天室功能详解
2020/05/27 PHP
Javascript限制网页只能在微信内置浏览器中访问
2014/11/09 Javascript
SuperSlide标签切换、焦点图多种组合插件
2015/03/14 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
2016/01/10 Javascript
JavaScript Date对象详解
2016/03/01 Javascript
微信小程序 wxapp内容组件 text详细介绍
2016/10/31 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
2016/12/02 Javascript
Vue.js教程之axios与网络传输的学习实践
2017/04/29 Javascript
vue keep-alive请求数据的方法示例
2018/05/16 Javascript
Python实现打印螺旋矩阵功能的方法
2017/11/21 Python
Python通过调用有道翻译api实现翻译功能示例
2018/07/19 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
2020/06/22 Python
python如何变换环境
2020/07/21 Python
python如何对链表操作
2020/10/10 Python
HTML5 canvas实现的静态循环滚动播放弹幕
2021/01/05 HTML / CSS
美国休闲服装品牌:J.Crew Factory
2017/03/04 全球购物
有原因的手表:Flex Watches
2019/03/23 全球购物
Nike香港官网:Nike HK
2019/03/23 全球购物
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
自考生自我评价分享
2014/01/18 职场文书
迎元旦广播稿
2014/02/22 职场文书
yy司仪主持词
2014/03/22 职场文书
公路绿化方案
2014/05/12 职场文书
教师自我剖析材料
2014/09/29 职场文书
学校纪律作风整改措施思想汇报
2014/10/11 职场文书
2014年优秀班主任工作总结
2014/12/16 职场文书
2015年教学工作总结
2015/04/02 职场文书
个人收入证明格式
2015/06/24 职场文书
导游词之云南丽江古城
2019/09/17 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
Ubuntu安装Mysql+启用远程连接的完整过程
2022/06/21 Servers