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模块加载技术的一些思考
Nov 28 Javascript
浅谈重写window对象的方法
Dec 29 Javascript
javascript文本模板用法实例
Jul 31 Javascript
jquery 仿锚点跳转到页面指定位置的实例
Feb 14 Javascript
node.js实现登录注册页面
Apr 08 Javascript
Node.js 8 中的 util.promisify的详解
Jun 12 Javascript
layui框架中layer父子页面交互的方法分析
Nov 15 Javascript
Vue如何实现响应式系统
Jul 11 Javascript
vue2使用keep-alive缓存多层列表页的方法
Sep 21 Javascript
微信网页登录逻辑与实现方法
Apr 29 Javascript
Vue Components 数字键盘的实现
Sep 18 Javascript
vue深度监听(监听对象和数组的改变)与立即执行监听实例
Sep 04 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设计模式 Facade(外观模式)
2011/06/26 PHP
php max_execution_time执行时间问题
2011/07/17 PHP
php使用Jpgraph绘制3D饼状图的方法
2015/06/10 PHP
php使用MySQL保存session会话的方法
2015/06/26 PHP
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
JQuery Tab选项卡效果代码改进版
2010/04/01 Javascript
基于JQuery实现异步刷新的代码(转载)
2011/03/29 Javascript
使用jquery操作session方法分享
2015/01/22 Javascript
javascript结合canvas实现图片旋转效果
2015/05/03 Javascript
简单实现js页面切换功能
2021/01/10 Javascript
Angular之指令Directive用法详解
2017/03/01 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
2017/06/09 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
Angular表格神器ui-grid应用详解
2017/09/29 Javascript
如何将你的AngularJS1.x应用迁移至React的方法
2018/02/01 Javascript
Vue CLI 3搭建vue+vuex最全分析(推荐)
2018/09/27 Javascript
详解Vue中使用插槽(slot)、聚类插槽
2019/04/12 Javascript
[04:13]2014DOTA2国际邀请赛 专访DC目前形势不容乐观
2014/07/12 DOTA
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
Python探索之URL Dispatcher实例详解
2017/10/28 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
值得收藏,Python 开发中的高级技巧
2018/11/23 Python
解决springboot yml配置 logging.level 报错问题
2020/02/21 Python
Python如何将将模块分割成多个文件
2020/08/04 Python
Python中读取文件名中的数字的实例详解
2020/12/25 Python
termux中matplotlib无法显示中文问题的解决方法
2021/01/11 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
泰国演唱会订票网站:StubHub泰国
2018/02/26 全球购物
工作自我评价分享
2013/12/01 职场文书
大学生学习计划书
2014/09/15 职场文书
小学生作文批改评语
2014/12/25 职场文书
行政经理岗位职责
2015/04/15 职场文书
高中班主任寄语
2019/06/21 职场文书
解析MySQL索引的作用
2022/03/03 MySQL
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android