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 相关文章推荐
jquery学习笔记二 实现可编辑的表格
Apr 09 Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
Jan 15 Javascript
TextArea设置MaxLength属性最大输入值的js代码
Dec 21 Javascript
javascript日期验证之输入日期大于等于当前日期
Dec 13 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
Dec 26 Javascript
Angular2学习教程之组件中的DOM操作详解
May 28 Javascript
Vue SPA单页应用首屏优化实践
Jun 28 Javascript
node.js到底要不要加分号浅析
Jul 11 Javascript
vue中引用swiper轮播插件的教程详解
Aug 16 Javascript
node中的session的具体使用
Sep 14 Javascript
浅谈如何优雅处理JavaScript异步错误
Nov 12 Javascript
详解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
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
PHP实现上一篇下一篇的方法实例总结
2016/09/22 PHP
Javascript调试工具(下载)
2007/01/09 Javascript
javascript 跨浏览器开发经验总结(五) js 事件
2010/05/19 Javascript
javascript中的prototype属性使用说明(函数功能扩展)
2010/08/16 Javascript
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
javascript垃圾收集机制与内存泄漏详细解析
2013/11/11 Javascript
清除div下面的所有标签的方法
2014/02/17 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
2015/12/25 Javascript
JS Array.slice 截取数组的实现方法
2016/01/02 Javascript
详解Javacript和AngularJS中的Promises
2016/02/09 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
2016/12/03 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
2018/04/04 Javascript
Vue点击切换颜色的方法
2018/09/13 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
uni app仿微信顶部导航条功能
2019/09/17 Javascript
js实现微信聊天效果
2020/08/09 Javascript
用Python实现KNN分类算法
2017/12/22 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
python通过paramiko复制远程文件及文件目录到本地
2019/04/30 Python
python3实现小球转动抽奖小游戏
2020/04/15 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
Python数据可视化:幂律分布实例详解
2019/12/07 Python
基于python实现数组格式参数加密计算
2020/04/21 Python
python操作链表的示例代码
2020/09/27 Python
体育学院毕业生自荐信
2013/11/03 职场文书
小学生演讲稿
2014/01/12 职场文书
英语自我评价范文
2014/01/24 职场文书
试用期转正员工自我评价
2014/09/18 职场文书
如何利用map实现Nginx允许多个域名跨域
2021/03/31 Servers
简单聊聊TypeScript只读修饰符
2022/04/06 Javascript