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解析XML的实现代码
Nov 12 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
Jan 13 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
Nov 12 Javascript
JQuery插件Marquee.js实现无缝滚动效果
Apr 26 Javascript
JavaScript来实现打开链接页面的简单实例
Jun 02 Javascript
深入理解bootstrap框架之第二章整体架构
Oct 09 Javascript
JS填写银行卡号每隔4位数字加一个空格
Dec 19 Javascript
jQuery实现页面滚动时智能浮动定位
Jan 08 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
Dec 20 Javascript
基于javascript实现贪吃蛇经典小游戏
Apr 10 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
Feb 01 Javascript
ES11新增的这9个新特性,你都掌握了吗
Oct 15 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
phpfans留言版用到的install.php
2007/01/04 PHP
PHP连接MongoDB示例代码
2012/09/06 PHP
浅析php数据类型转换
2014/01/09 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
Laravel框架路由管理简单示例
2019/05/07 PHP
javaScript 读取和设置文档元素的样式属性
2009/04/14 Javascript
浅谈tudou土豆网首页图片延迟加载的效果
2010/06/23 Javascript
Jquery常用技巧收集整理篇
2010/11/14 Javascript
文本框文本自动补全效果示例分享
2014/01/19 Javascript
jquery+ajax请求且带返回值的代码
2015/08/12 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
聊一聊Vue.js过渡效果
2016/09/07 Javascript
jQuery Ajax使用FormData对象上传文件的方法
2016/09/07 Javascript
Vue中的ref作用详解(实现DOM的联动操作)
2017/08/21 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
Vue前后端不同端口的实现方法
2018/09/19 Javascript
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
JS代码实现页面切换效果
2021/01/10 Javascript
解决Linux系统中python matplotlib画图的中文显示问题
2017/06/15 Python
Python实现插入排序和选择排序的方法
2019/05/12 Python
python中的协程深入理解
2019/06/10 Python
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
Python实现数值积分方式
2019/11/20 Python
python + selenium 刷B站播放量的实例代码
2020/06/12 Python
美国CVS药店官网:CVS Pharmacy
2018/07/26 全球购物
厨房工作人员岗位职责
2013/11/15 职场文书
致全体运动员广播稿
2014/02/01 职场文书
食品委托检验协议书范本
2014/09/12 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
党员教师群众路线个人整改措施
2014/10/28 职场文书
应急管理工作总结2015
2015/05/04 职场文书
个人工作失误的保证书怎么写?
2019/06/21 职场文书
win10清理dns缓存
2022/04/19 数码科技