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 相关文章推荐
List Installed Software Features
Jun 11 Javascript
JQUERY CHECKBOX全选,取消全选,反选方法三
Aug 30 Javascript
Prototype Object对象 学习
Jul 12 Javascript
有关JavaScript的10个怪癖和秘密分享
Aug 28 Javascript
浅析js中的浮点型运算问题
Jan 06 Javascript
AngularJS 如何在控制台进行错误调试
Jun 07 Javascript
ES6生成器用法实例分析
Apr 10 Javascript
JS验证全角与半角及相互转化的介绍
May 18 Javascript
swiper 自动图片无限轮播实现代码
May 21 Javascript
Express本地测试HTTPS的示例代码
Jun 06 Javascript
加快Vue项目的开发速度的方法
Dec 12 Javascript
微信小程序搜索功能(附:小程序前端+PHP后端)
Feb 28 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 无限级 SelectTree 类
2009/05/19 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
js如何取消事件冒泡
2013/09/23 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
深入理解JavaScript系列(30):设计模式之外观模式详解
2015/03/03 Javascript
浅谈js中的in-for循环
2016/06/28 Javascript
利用 spin.js 生成等待效果(js 等待效果)
2017/06/25 Javascript
JavaScript数据类型的存储方法详解
2017/08/25 Javascript
解决vue2中使用axios http请求出现的问题
2018/03/05 Javascript
jQuery实现带3D切割效果的轮播图功能示例【附源码下载】
2019/04/04 jQuery
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
常见的浏览器存储方式(cookie、localStorage、sessionStorage)
2019/05/07 Javascript
利用Vue实现一个markdown编辑器实例代码
2019/05/19 Javascript
通过实践编写优雅的JavaScript代码
2019/05/30 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
JavaScript仿京东轮播图效果
2021/02/25 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
在Python下尝试多线程编程
2015/04/28 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
2017/06/07 Python
Python判断文件和字符串编码类型的实例
2017/12/21 Python
python得到单词模式的示例
2018/10/15 Python
python添加菜单图文讲解
2019/06/04 Python
Python Numpy 实现交换两行和两列的方法
2019/06/26 Python
python实现图片压缩代码实例
2019/08/12 Python
在Python中画图(基于Jupyter notebook的魔法函数)
2019/10/28 Python
opencv3/C++实现视频背景去除建模(BSM)
2019/12/11 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
如何学习Python time模块
2020/06/03 Python
澳大利亚汽车零部件、音响及配件超市:Automotive Superstore
2018/06/19 全球购物
会计毕业生自我鉴定
2013/11/04 职场文书
社区活动策划方案
2014/08/21 职场文书
学校端午节活动方案
2014/08/23 职场文书
离婚协议书怎么写
2015/01/26 职场文书
2015年五四青年节演讲稿
2015/03/18 职场文书