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 parseInt与Number函数的区别
Jan 21 Javascript
JS 获取浏览器和屏幕宽高等信息的实现思路及代码
Jul 31 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
Jan 09 Javascript
原生javascript实现Tab选项卡切换功能
Jan 12 Javascript
JS+CSS实现的经典tab选项卡效果代码
Sep 16 Javascript
基于javascript代码实现通过点击图片显示原图片
Nov 29 Javascript
Vue.JS入门教程之处理表单
Dec 01 Javascript
bootstrap modal弹出框的垂直居中
Dec 14 Javascript
Vue中组件之间数据的传递的示例代码
Sep 08 Javascript
JavaScript面向对象精要(上部)
Sep 12 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
Aug 19 Javascript
使用Cargo工具高效创建Rust项目
Aug 14 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
封装一个PDO数据库操作类代码
2009/09/09 PHP
PHP读取数据库并按照中文名称进行排序实现代码
2013/01/29 PHP
php解压文件代码实现php在线解压
2014/02/13 PHP
JS中prototype关键字的功能介绍及使用示例
2013/07/21 Javascript
js实现文本框中焦点在最后位置
2014/03/04 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
js函数内变量的作用域分析
2015/01/12 Javascript
Prototype框架详解
2015/11/25 Javascript
Bootstrap 源代码分析(未完待续)
2016/08/17 Javascript
Vue.js学习之计算属性
2017/01/22 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
2017/11/08 jQuery
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
利用原生JavaScript实现造日历轮子实例代码
2019/05/08 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
python 实现红包随机生成算法的简单实例
2017/01/04 Python
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
详解Python if-elif-else知识点
2018/06/11 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
Python如何使用OS模块调用cmd
2020/02/27 Python
python实现梯度法 python最速下降法
2020/03/24 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
Python控制台实现交互式环境执行
2020/06/09 Python
澳大利亚礼品卡商店:Gift Card Store
2019/06/24 全球购物
国际贸易专业自荐信
2014/06/10 职场文书
怎样写离婚协议书
2014/09/10 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
学校师德师风整改措施
2014/10/27 职场文书
2014年工程部工作总结
2014/11/25 职场文书
家长给老师的感谢信
2015/01/20 职场文书
银行自荐信怎么写
2015/03/05 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
jquery插件实现图片悬浮
2021/04/16 jQuery
使用scrapy实现增量式爬取方式
2022/06/21 Python