javascript用defineProperty实现简单的双向绑定方法


Posted in Javascript onApril 03, 2020

defineProperty

Object提供的方法,用于给对象添加自定义属性具体用法如下:

const obj = { _value: 1 };

Object.defineProperty(obj, 'value', {
  get: function() {
    console.log('get方法执行');
    return this._value;
  },
  set: function(a) {
    console.log('set方法执行');
    this._value = a;
  }
})
obj.value = 3;
console.log(obj.value);
console.log(obj._value);

在node中执行结果如下:

javascript用defineProperty实现简单的双向绑定方法

下面来分析一下代码
首先定一个对象,并对对象添加一个自定义属性value,同时添加了getter,setter两个函数用来分别控制value属性的修改和获取,
当执行obj.value = 3;时,会自动调属性的setter方法,将value的修改同步到_value属性上,当执行obj.value语句获取属性值时,会自动调用getter方法获取方法的返回值;

总结 (参考MDN)
该方法接收三个参数
obj:要添加属性的对象
prop: 要定义的属性
descriptor:要定义或者修改的属性描述符
其中描述符包含以下几种

1.configurable:布尔值,控制属性是否能改变(除了value,writable)及删除
2.enumerable: 布尔值,控制属性是否可枚举,即通过for in循环或者Object.keys访问
3.value:属性值,可以时任何有效JavaScript值
4.writable 布尔值,属性可否通过赋值修改
5.get:属性getter函数,执行时传入this,this值取决于调用者
6.set:属性setter函数,赋值时执行,并传入this

双向绑定

由此可以设计一下数据双向绑定的简单实现:
在数据对象内定义属性,通过对dom绑定事件监听dom内值的变化,并赋值给数据对象,数据对象的改动会调用自身的setter方法,在方法内在动态修改dom内容。

代码如下:

<!-- 简单数据双向绑定实现 -->
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <div id="root">
      <button id='btn'>请求数据</button>
    </div>
  </body>
  <script>
    const root = document.getElementById('root');
    const btn = document.getElementById('btn');
    const input = document.createElement('input');
    const model = document.createElement('p');
    const dataModel = {
      _value:0,
    }
    Object.defineProperty(dataModel, 'value', {
      configurable: true,
      set:function(value){
        this._value = value;
        input.value = value;
        model.innerHTML = `<span>数据模型:</sapn> ${value}`;
      },
      get:function(){
        return this._value;
      }
    })

    btn.addEventListener('click', () => {
      const range = Math.floor(Math.random(0, 1) * 100);
      dataModel.value = range;
    })

    input.addEventListener('input',(ev) => {
      dataModel.value = ev.target.value;
    })

    const initPage = () => {
      dataModel.value = 100;
    }
    initPage();
    root.append(input);
    root.append(model);
  </script>
</html>

描述有点乱,看实现代码更清晰一点,有问题欢迎指正

到此这篇关于javascript用defineProperty实现简单的双向绑定方法的文章就介绍到这了,更多相关javascript defineProperty双向绑定内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jscript之List Excel Color Values
Jun 13 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
Jan 03 Javascript
即将发布的jQuery 3 有哪些新特性
Apr 14 Javascript
微信小程序 122100版本更新问题解决方案
Dec 22 Javascript
webpack实现热加载自动刷新的方法
Jul 30 Javascript
使用vuex的state状态对象的5种方式
Apr 19 Javascript
jquery实现动态添加附件功能
Oct 23 jQuery
angular2 NgModel模块的具体使用方法
Apr 10 Javascript
Node.js爬虫如何获取天气和每日问候详解
Aug 26 Javascript
JavaScript中的类型检查
Feb 03 Javascript
vue+element ui实现锚点定位
Jun 29 Vue.js
详解Vue的列表渲染
Nov 20 Vue.js
JavaScript检测浏览器是否支持CSS变量代码实例
Apr 03 #Javascript
JS内置对象和Math对象知识点详解
Apr 03 #Javascript
vue组件库的在线主题编辑器的实现思路
Apr 03 #Javascript
JavaScript鼠标拖拽事件详解
Apr 03 #Javascript
Javascript组合继承方法代码实例解析
Apr 02 #Javascript
Javascript异步编程async实现过程详解
Apr 02 #Javascript
JS实现图片懒加载(lazyload)过程详解
Apr 02 #Javascript
You might like
php预定义变量使用帮助(带实例)
2013/10/30 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
JavaScript 获取当前时间戳的代码
2010/08/05 Javascript
基于jQuery的图片剪切插件
2011/08/03 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
2012/01/15 Javascript
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
Javascript前端UI框架Kit使用指南之kitjs事件管理
2014/11/28 Javascript
jQuery实现根据滚动条位置加载相应内容功能
2016/07/18 Javascript
Javascript实现数组中的元素上下移动
2017/04/28 Javascript
使用node.js搭建服务器
2017/05/20 Javascript
JavaScript动态绑定详解
2017/09/14 Javascript
Rollup处理并打包JS文件项目实例代码
2018/05/31 Javascript
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
vue 子组件和父组件传值的示例
2020/09/11 Javascript
vue print.js打印支持Echarts图表操作
2020/11/13 Javascript
Python制作简单的网页爬虫
2015/11/22 Python
Python制作豆瓣图片的爬虫
2017/12/28 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
python绘制多个曲线的折线图
2020/03/23 Python
python单例模式的多种实现方法
2019/07/26 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
pytorch:torch.mm()和torch.matmul()的使用
2019/12/27 Python
python保留小数位的三种实现方法
2020/01/07 Python
python3通过udp实现组播数据的发送和接收操作
2020/05/05 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
合作协议书格式
2014/08/19 职场文书
秋季校运会广播稿100字
2014/09/18 职场文书
化工见习报告范文
2014/10/31 职场文书
关于五一放假的通知
2015/08/18 职场文书
2016年敬老月活动总结
2016/04/05 职场文书
导游词之无锡唐城
2019/12/12 职场文书
导游词之重庆渣滓洞
2020/01/08 职场文书