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 相关文章推荐
JavaScript中的单引号和双引号报错的解决方法
Sep 01 Javascript
教你使用javascript简单写一个页面模板引擎
May 05 Javascript
基于javascript实现简单计算器功能
Jan 03 Javascript
JS封装的自动创建表格的实现代码
Jun 15 Javascript
JSON字符串和对象相互转换实例分析
Jun 16 Javascript
基于jQuery实现一个marquee无缝滚动的插件
Mar 09 Javascript
Angular5中调用第三方库及jQuery的添加的方法
Jun 07 jQuery
iview Upload组件多个文件上传的示例代码
Sep 30 Javascript
vue中组件的过渡动画及实现代码
Nov 21 Javascript
Javascript三种字符串连接方式及性能比较
May 28 Javascript
vue组件命名和props命名代码详解
Sep 01 Javascript
原生javascript制作的拼图游戏实现方法详解
Feb 23 Javascript
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
Views rows style模板重写代码
2011/05/16 PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
2013/08/15 PHP
PHP用星号隐藏部份用户名、身份证、IP、手机号等实例
2014/04/08 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
Markdown+Bootstrap图片自适应属性详解
2016/05/21 Javascript
浅谈jquery点击label触发2次的问题
2016/06/12 Javascript
原生js轮播(仿慕课网)
2017/02/15 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
jquery插件canvaspercent.js实现百分比圆饼效果
2017/07/18 jQuery
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
前端Electron新手入门教程详解
2019/06/21 Javascript
微信小程序 wx.getUserInfo引导用户授权问题实例分析
2020/03/09 Javascript
Postman参数化实现过程及原理解析
2020/08/13 Javascript
Vue.js使用axios动态获取response里的data数据操作
2020/09/08 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
python实现指定字符串补全空格的方法
2015/04/30 Python
Python中对元组和列表按条件进行排序的方法示例
2015/11/10 Python
利用Python如何生成随机密码
2016/04/20 Python
python生成tensorflow输入输出的图像格式的方法
2018/02/12 Python
Matplotlib 生成不同大小的subplots实例
2018/05/25 Python
详解如何将python3.6软件的py文件打包成exe程序
2018/10/09 Python
Python 的字典(Dict)是如何存储的
2019/07/05 Python
Django中的用户身份验证示例详解
2019/08/07 Python
PIL对上传到Django的图片进行处理并保存的实例
2019/08/07 Python
python scipy卷积运算的实现方法
2019/09/16 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
Python使用PyQt5/PySide2编写一个极简的音乐播放器功能
2020/02/07 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
HTML5 weui使用笔记
2019/11/21 HTML / CSS
吉力贝官方网站:Jelly Belly
2019/03/11 全球购物
英文简历中的自我评价用语
2013/12/09 职场文书
公司行政助理岗位职责
2015/04/11 职场文书
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL
解决python存数据库速度太慢的问题
2021/04/23 Python