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 相关文章推荐
利用XMLHTTP传递参数在另一页面执行并刷新本页
Oct 26 Javascript
jQuery EasyUI API 中文文档 可调整尺寸
Sep 29 Javascript
javascript之typeof、instanceof操作符使用探讨
May 19 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
Oct 24 Javascript
jQuery实现textarea自动增长宽高的方法
Dec 18 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
Aug 29 Javascript
javascript闭包的使用之按钮切换功能
Aug 30 Javascript
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
Nov 16 Javascript
vue使用showdown并实现代码区域高亮的示例代码
Oct 17 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
Oct 26 Javascript
JavaScript实现雪花飘落效果
Dec 27 Javascript
JavaScript 对象创建的3种方法
Nov 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实现验证码功能
2006/10/09 PHP
php 冒泡排序 交换排序法
2011/05/10 PHP
解析php获取字符串的编码格式的方法(函数)
2013/06/21 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
php遍历解析xml字符串的方法
2016/05/05 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
for 循环性能比较 提高for循环的效率
2009/03/19 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
原生javascript制作的拼图游戏实现方法详解
2020/02/23 Javascript
[00:52]黑暗之门更新 新英雄孽主驾临DOTA2
2016/08/24 DOTA
python在每个字符后添加空格的实例
2018/05/07 Python
Python子类继承父类构造函数详解
2019/02/19 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
2019/07/01 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
2019/10/04 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
五分钟带你搞懂python 迭代器与生成器
2020/08/30 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
2020/12/04 Python
如何用H5实现一个触屏版的轮播器的实例
2017/01/09 HTML / CSS
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
Sisley法国希思黎美国官方网站:享誉全球的奢华植物美容品牌
2020/06/27 全球购物
银行实习人员自我鉴定
2013/09/22 职场文书
外国语学院毕业生自荐信
2013/10/28 职场文书
运动会通讯稿50字
2014/01/30 职场文书
音乐兴趣小组活动总结
2014/07/07 职场文书
律师催款函范文
2015/06/24 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
公司团队口号霸气押韵
2015/12/24 职场文书
2016年“11.11”光棍节活动总结
2016/04/05 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书
解决pytorch读取自制数据集出现过的问题
2021/05/31 Python
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL
Pandas 数据编码的十种方法
2022/04/20 Python