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 面向对象的5钟写法
Jul 31 Javascript
AngularJS入门教程之AngularJS表达式
Apr 18 Javascript
javascript 中Cookie读、写与删除操作
Mar 29 Javascript
JavaScript数据结构之二叉树的计数算法示例
Apr 13 Javascript
JavaScript箭头(arrow)函数详解
Jun 04 Javascript
Javacript中自定义的map.js  的方法
Nov 26 Javascript
vue.js 2.0实现简单分页效果
Jul 29 Javascript
微信小程序使用npm包的方法步骤
Aug 13 Javascript
JS 数组基本用法入门示例解析
Jan 16 Javascript
javascript设计模式 ? 职责链模式原理与用法实例分析
Apr 16 Javascript
谈谈我在vue-cli3中用预渲染遇到的坑
Apr 22 Javascript
Kettle中使用JavaScrip调用jar包对文件内容进行MD5加密的操作方法
Sep 04 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中遇到的时区问题解决方法
2015/07/23 PHP
js可突破windows弹退效果代码
2008/08/09 Javascript
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
Js+Flash实现访问剪切板操作
2012/11/20 Javascript
js 调用本地exe的例子(支持IE内核的浏览器)
2012/12/26 Javascript
Jquery中国地图热点效果-鼠标经过弹出提示层信息的简单实例
2014/02/12 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
JavaScript实现防止网页被嵌入Frame框架的代码分享
2014/12/29 Javascript
JS获取表格内指定单元格html内容的方法
2015/03/31 Javascript
Nodejs中解决cluster模块的多进程如何共享数据问题
2016/11/10 NodeJs
JavaScript之json_动力节点Java学院整理
2017/06/29 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
vue 项目中使用Loading组件的示例代码
2018/08/31 Javascript
微信小程序跳转到其他网页(外部链接)的实现方法
2019/09/20 Javascript
JS实现图片切换特效
2019/12/23 Javascript
Jquery如何使用animation动画效果改变背景色的代码
2020/07/20 jQuery
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
[42:20]2014 DOTA2华西杯精英邀请赛5 24 DK VS NewBee
2014/05/25 DOTA
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
Python实现二叉搜索树
2016/02/03 Python
在windows下快速搭建web.py开发框架方法
2016/04/22 Python
python通过txt文件批量安装依赖包的实现步骤
2019/08/13 Python
python matplotlib模块基本图形绘制方法小结【直线,曲线,直方图,饼图等】
2020/04/26 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
css3学习心得分享
2013/08/19 HTML / CSS
美国手机支架公司:PopSockets
2019/11/27 全球购物
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
英文商务邀请信
2014/01/22 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
小学思品教学反思
2016/02/20 职场文书
教你用Java Swing实现自助取款机系统
2021/06/11 Java/Android
python编程学习使用管道Pipe编写优化代码
2021/11/20 Python
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle