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滚动字幕效果实现代码
Jun 22 Javascript
用JQuery实现全选与取消的两种简单方法
Feb 22 Javascript
javascript实现显示和隐藏div方法汇总
Aug 14 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
Oct 23 Javascript
jquery删除数组中重复元素
Dec 05 Javascript
JavaScript实现替换字符串中最后一个字符的方法
Mar 07 Javascript
详解webpack es6 to es5支持配置
May 04 Javascript
layui获取多选框中的值方法
Aug 15 Javascript
三种Webpack打包方式(小结)
Sep 19 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
Oct 01 Javascript
详解Vue3使用axios的配置教程
Apr 29 Vue.js
JavaScript原型链中函数和对象的理解
Jun 16 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树-不需要递归的实现方法
2016/06/21 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
js+数组实现网页上显示时间/星期几的实用方法
2013/01/18 Javascript
Js参数值中含有单引号或双引号问题的解决方法
2013/11/06 Javascript
js输入框邮箱自动提示功能代码实现
2013/12/10 Javascript
仿百度联盟对联广告实现代码
2014/08/30 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
详解Vue中watch的高级用法
2018/05/02 Javascript
详解node Async/Await 更好的异步编程解决方案
2018/05/10 Javascript
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
用vuex写了一个购物车H5页面的示例代码
2018/12/04 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
Layui实现数据表格中鼠标悬浮图片放大效果,离开时恢复原图的方法
2019/09/11 Javascript
JavaScript Window浏览器对象模型原理解析
2020/05/30 Javascript
koa2 数据api中间件设计模型的实现方法
2020/07/13 Javascript
vue 验证两次输入的密码是否一致的方法示例
2020/09/29 Javascript
[01:01:04]2018DOTA2亚洲邀请赛 4.5 淘汰赛 OpTic vs TNC 第一场
2018/04/06 DOTA
Python splitlines使用技巧
2008/09/06 Python
python的id()函数介绍
2013/02/10 Python
python支持断点续传的多线程下载示例
2014/01/16 Python
Python的print用法示例
2014/02/11 Python
Python 专题一 函数的基础知识
2017/03/16 Python
python开启debug模式的方法
2019/06/27 Python
python set内置函数的具体使用
2019/07/02 Python
Python urlopen()和urlretrieve()用法解析
2020/01/07 Python
Python之Matplotlib文字与注释的使用方法
2020/06/18 Python
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
大学生个人学年总结
2015/02/15 职场文书
毕业设计致谢语
2015/05/14 职场文书
校园广播稿范文
2015/08/19 职场文书
新学期新寄语,献给新生们!
2019/11/15 职场文书
MySQL学习之基础操作总结
2022/03/19 MySQL
javascript进阶篇深拷贝实现的四种方式
2022/07/07 Javascript