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对数组的常用操作代码 数组方法总汇
Jan 27 Javascript
jQuery 源码分析笔记(2) 变量列表
May 28 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
Jun 21 Javascript
js取得url地址参数实例
Feb 22 Javascript
jQuery中get和post方法传值测试及注意事项
Aug 08 Javascript
js/jquery判断浏览器的方法小结
Sep 02 Javascript
innerHTML中标签可以换行的方法汇总
Aug 14 Javascript
JavaScript面向对象编写购物车功能
Aug 19 Javascript
jQuery实现邮箱下拉列表自动补全功能
Sep 08 Javascript
javascript中UMD规范的代码推演
Aug 29 Javascript
React中阻止事件冒泡的问题详析
Apr 12 Javascript
解决Vue+SpringBoot+Shiro跨域问题
Jun 09 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
在IIS上安装PHP4.0正式版
2006/10/09 PHP
php socket方式提交的post详解
2008/07/19 PHP
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
PHP中的一些常用函数收集
2015/05/26 PHP
PHP针对字符串开头和结尾的判断方法
2016/07/11 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
thinkPHP简单调用函数与类库的方法
2017/03/15 PHP
详解php实现页面静态化原理
2017/06/21 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
2019/10/10 PHP
javascript 模拟JQuery的Ready方法实现并出现的问题
2009/12/06 Javascript
瀑布流布局并自动加载实现代码
2013/03/12 Javascript
JavaScript中的object转换函数toString()与valueOf()介绍
2014/12/31 Javascript
jQuery动态星级评分效果实现方法
2015/08/06 Javascript
高性能JavaScript DOM编程(1)
2015/08/11 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
Angular2自定义分页组件
2017/04/19 Javascript
微信小程序开发之toast等弹框提示使用教程
2017/06/08 Javascript
基于Vue2.0+ElementUI实现表格翻页功能
2017/10/23 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
django上传图片并生成缩略图方法示例
2017/12/11 Python
python匹配两个短语之间的字符实例
2018/12/25 Python
Python3实现的简单工资管理系统示例
2019/03/12 Python
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
NumPy统计函数的实现方法
2020/01/21 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
如何在django中实现分页功能
2020/04/22 Python
浅谈Python 钉钉报警必备知识系统讲解
2020/08/17 Python
python语言time库和datetime库基本使用详解
2020/12/25 Python
extern在函数声明中是什么意思
2014/01/19 面试题
生物化工工艺专业应届生求职信
2013/10/08 职场文书
2014全国两会学习心得体会2000字
2014/03/10 职场文书
工作会议主持词
2014/03/17 职场文书
销售内勤岗位职责
2015/02/10 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
mysql的数据压缩性能对比详情
2021/11/07 MySQL
js作用域及作用域链工作引擎
2022/07/07 Javascript