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 DOM 添加事件
Feb 14 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
Jan 23 Javascript
用js代码和插件实现wordpress雪花飘落效果的四种方法
Dec 15 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
May 23 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
Oct 19 Javascript
swiper移动端轮播插件(触碰图片之后停止轮播)
Dec 28 Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
Sep 18 Javascript
图文讲解vue的v-if使用方法
Feb 11 Javascript
详解如何在vue项目中使用layui框架及采坑
May 05 Javascript
模块化react-router配置方法详解
Jun 03 Javascript
Angular8路由守卫原理和使用方法
Aug 29 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
Jul 21 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
PHP面向对象分析设计的61条军规小结
2010/07/17 PHP
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
46 个非常有用的 PHP 代码片段
2016/02/16 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
对PHP依赖注入的理解实例分析
2016/10/09 PHP
jquery对表单操作2
2011/04/06 Javascript
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
jquery ajax 局部无刷新更新数据的实现案例
2014/02/08 Javascript
JavaScript拆分字符串时产生空字符的解决方案
2014/09/26 Javascript
node.js+express制作网页计算器
2016/01/17 Javascript
简述Matlab中size()函数的用法
2016/03/20 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
2016/06/02 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
关于定制FileField中的上传文件名称问题
2017/08/22 Javascript
Vue v2.5 调整和更新不完全问题
2017/10/24 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
小程序点赞收藏功能的实现代码示例
2018/09/07 Javascript
webpack4打包vue前端多页面项目
2018/09/17 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
jQuery实现颜色打字机的完整代码
2020/03/19 jQuery
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
Python下的常用下载安装工具pip的安装方法
2015/11/13 Python
解决Django加载静态资源失败的问题
2019/07/28 Python
解决Django中调用keras的模型出现的问题
2019/08/07 Python
Python实现名片管理系统
2020/02/14 Python
python装饰器三种装饰模式的简单分析
2020/09/04 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
css3实现波纹特效、H5实现动态波浪效果
2018/01/31 HTML / CSS
Monnier Freres中文官网:法国领先的奢侈品配饰在线零售商
2017/11/01 全球购物
美赞臣新加坡官方旗舰店:Enfagrow新加坡
2019/05/15 全球购物
治理商业贿赂工作总结
2015/08/10 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python
Java 数据结构七大排序使用分析
2022/04/02 Java/Android