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笔试题目附答案@20081025_jb51.net
Oct 26 Javascript
Javascript页面添加到收藏夹的简单方法
Aug 07 Javascript
angularJS 中input示例分享
Feb 09 Javascript
javascript作用域问题实例分析
Jul 13 Javascript
jquery+css实现绚丽的横向二级下拉菜单-附源码下载
Aug 23 Javascript
深入理解Commonjs规范及Node模块实现
May 17 Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
Jun 26 Javascript
用js将long型数据转换成date型或datetime型的实例
Jul 03 Javascript
JavaScript设计模式之工厂模式和抽象工厂模式定义与用法分析
Jul 26 Javascript
TypeScript中的方法重载详解
Apr 12 Javascript
JS实现的碰撞检测与周期移动完整示例
Sep 02 Javascript
JavaScript原型链详解
Nov 07 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
使用数据库保存session的方法
2006/10/09 PHP
PHP数组编码gbk与utf8互相转换的两种方法
2016/09/01 PHP
解决在laravel中auth建立时候遇到的问题
2019/10/15 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
javascript中普通函数的使用介绍
2013/12/19 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
jQuery通过Ajax返回JSON数据
2015/04/28 Javascript
原生js实现模拟滚动条
2015/06/15 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
微信小程序 空白页重定向解决办法
2017/06/27 Javascript
webstorm添加vue.js支持的方法教程
2017/07/05 Javascript
详解Node.js利用node-git-server快速搭建git服务器
2017/09/27 Javascript
JS实现520 表白简单代码
2018/05/21 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
2018/08/24 Javascript
详解vue移动端项目代码拆分记录
2019/03/15 Javascript
原生JavaScript实现进度条
2021/02/19 Javascript
Python基于BeautifulSoup爬取京东商品信息
2020/06/01 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
python实现控制台输出颜色
2021/03/02 Python
美国孩之宝玩具官网:Hasbro Pulse
2019/06/24 全球购物
英国最好的温室之家:Greenhouses Direct
2019/07/13 全球购物
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
圣彼得堡鲜花配送:Semicvetic
2020/09/15 全球购物
广告设计专业自荐信范文
2013/11/14 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
校园会短篇的广播稿
2014/10/21 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书
新员工入职感言范文!
2019/07/04 职场文书
六年级作文之关于梦
2019/10/22 职场文书
python本地文件服务器实例教程
2021/05/02 Python
详解Redis主从复制实践
2021/05/19 Redis
http通过StreamingHttpResponse完成连续的数据传输长链接方式
2022/02/12 Python