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 匿名函数的理解(透彻版)
Jan 28 Javascript
浅析javascript闭包 实例分析
Dec 25 Javascript
jquery+css3打造一款ajax分页插件(自写)
Jun 18 Javascript
理解javascript回调函数
Dec 28 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
May 20 Javascript
vue.js初学入门教程(1)
Nov 03 Javascript
JavaScript实现星星等级评价功能
Mar 22 Javascript
vue select二级联动第二级默认选中第一个option值的实例
Jan 10 Javascript
不得不知的ES6小技巧
Jul 28 Javascript
微信小程序使用map组件实现获取定位城市天气或者指定城市天气数据功能
Jan 22 Javascript
js中switch语句的学习笔记
Mar 25 Javascript
Element中Slider滑块的具体使用
Jul 29 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中通过smtp发邮件的类,测试通过
2007/01/22 PHP
PHP文件读写操作之文件读取方法详解
2011/01/13 PHP
选择PHP作为网站开发语言的原因分享
2012/01/03 PHP
php类中private属性继承问题分析
2012/11/01 PHP
php更新修改excel中的内容实例代码
2014/02/26 PHP
PHP类的反射用法实例
2014/11/03 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
2015/11/15 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
JSON 编辑器实现代码
2009/12/06 Javascript
基于jquery的二级联动菜单实现代码
2011/04/25 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
2014/01/07 Javascript
超链接的禁用属性Disabled使用示例
2014/07/31 Javascript
node.js中的fs.exists方法使用说明
2014/12/17 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
浅析javascript函数表达式
2016/02/10 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
2016/02/25 Javascript
Angularjs中使用轮播图指令swiper
2017/05/30 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
2017/12/20 Javascript
vuex直接赋值的三种方法总结
2018/09/16 Javascript
NodeJS和浏览器中this关键字的不同之处
2021/03/03 NodeJs
Python复制文件操作实例详解
2015/11/10 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
python selenium firefox使用详解
2019/02/26 Python
python爬虫 urllib模块url编码处理详解
2019/08/20 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
pytorch 查看cuda 版本方式
2020/06/23 Python
利用纯css3实现的文字亮光特效的代码演示
2014/11/27 HTML / CSS
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
平民服装店创业计划书
2014/01/17 职场文书
司法助理专业自荐书
2014/06/13 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
十八大观后感
2015/06/12 职场文书
退休欢送会致辞
2015/07/31 职场文书
谢师宴家长答谢词
2015/09/30 职场文书
党员反四风学习心得体会
2016/01/22 职场文书