优秀的编程知识分享平台

网站首页 > 技术文章 正文

原生JS实现双向绑定(vue.js 双向绑定)

nanyue 2024-08-29 20:59:09 技术文章 4 ℃

本文来自我的小伙伴小帅,从JS基础出发一起学习JS,全网首发


对象的属性分为:数据属性和访问器属性。如果要修改对象的默认特性,必须使用Object.defineProperty方法,它接收三个参数:属性所在的对象、属性的名字、一个描述符对象。


下面是MDN上面的解释:



数据属性:

数据属性包含一个数据值的位置,在这个位置可以读取和写入值,数据属性有4个描述其行为的特性。

· Configurable:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。默认值为true。

· Enumberable:表示能否通过for-in循环返回属性。默认值为true。

· Writable:表示能否修改属性的值。默认值为true。

· Value:包含这个属性的数据值。读取属性值的时候,从这个位置读;定稿属性值的时候,把新值保存在这个位置。默认值为true。


访问器属性:

访问器属性不包含数据值;它们包含一对getter、setter函数(两个函数不是必须的)。在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理数据。访问器属性有如下4个特性。

· Configurable:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。默认值为true。

· Enumerable:表示能否通过for-in循环返回属性。默认值为true。

· Get:在读取属性时调用的函数。默认值为undefined。

· Set:在写入属性时调用的函数。默认值为undefined。


利用访问器属性实现简单的数据双向绑定


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
  </head>
  <body>
    <input type="text" id="input">
    <div id="innerText"></div>

    <script>
    	let obj = {
          name:'小帅',
          age:'22'
        }
        const input = document.getElementById('input');
        const text = document.getElementById('innerText');
        Object.defineProperty(obj,'nickName',{
            configurable:true,
            enumerable:true,
            get: function() {
              console.log('触发get')
              console.log(obj)
              return input.value
            },
            set: function(val) {
              console.log('触发set')
              console.log(val)
              text.innerHTML = val
              input.value = val
            }
        })
        // console.log(obj)

      input.addEventListener('keyup', function(e){
        console.log(e.target.value)  
        obj.nickName = e.target.value;
      });
      document.getElementById('innerText').innerHTML =  obj.name
    </script>
  </body>
</html>


Input输入内容, div的内容也会随着改变

手动修改对象obj也会 同步到input和div的内容

最近发表
标签列表