JavaScript模拟Vue实现双向绑定

最近一直做vue相关项目开发,对于vue的底层原理不是很清楚,今天搜集各种资料并整理

1、MVVM介绍

我们知道Vue是基于MVVM的一个前端框架,首先来介绍下什么是MVVM?

M:模型层,主要负责业务数据相关;

V:视图层,顾名思义,负责视图相关,细分下来就是html+css层;

VM:V与M沟通的桥梁,负责监听M或者V的修改,是实现MVVM双向绑定的要点;


其次,使用Object.defineProperty实现MVVM的表单数据双向绑定,当修改data属性之后,Vue立刻监听到,data属性被代理到vm上。

2、对象的定义与赋值

经常使用的定义与赋值方法obj.prop =value或者obj['prop']=value

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
	</body>
</html>
<script type="application/javascript">debugger;
	let Person = {};
	Person.name = "yangdechao";
	Person["sex"] = "男";
	console.log(Person.name);
	console.log(Person.sex);
</script>

3、定义属性的两种方式

  

 //1
    var obj = {};
    obj.name = 'yangdechao';
    
    //相当于
    Object.defineProperty(obj,'name',{
        value : 'yangdechao',
        writable: true,
        configurable: true,
        enumerable: true
    })
    
    //2
    Object.defineProperty(obj,'name',{value: 'yangdechao'})
    
    //相当于
    Object.defineProperty(obj,'name',{
        value: 'yangdechao',
        writable: false,
        configurable: false,
        enumerable: false
    })

4、Object.defineProperty()语法说明

Object.defineProperty()的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性

Object.defineProperty(obj, prop, desc)
  1. obj 需要定义属性的当前对象
  2. prop 当前需要定义的属性名
  3. desc 属性描述符

一般通过为对象的属性赋值的情况下,对象的属性可以修改也可以删除,但是通过Object.defineProperty()定义属性,通过描述符的设置可以进行更精准的控制对象属性。

属性的特性以及内部属性

javacript 有三种类型的属性

  1. 命名数据属性:拥有一个确定的值的属性。这也是最常见的属性
  2. 命名访问器属性:通过gettersetter进行读取和赋值的属性
  3. 内部属性:由JavaScript引擎内部使用的属性,不能通过JavaScript代码直接访问到,不过可以通过一些方法间接的读取和设置。比如,每个对象都有一个内部属性[[Prototype]],你不能直接访问这个属性,但可以通过Object.getPrototypeOf()方法间接的读取到它的值。虽然内部属性通常用一个双吕括号包围的名称来表示,但实际上这并不是它们的名字,它们是一种抽象操作,是不可见的,根本没有上面两种属性有的那种字符串类型的属性
    <body>
      <div id="app">
        <input type="text" id="txt">
        <p id="show"></p>
      </div>
    </body>
    <script type="text/javascript">
      var obj = {}
      Object.defineProperty(obj, 'content', {
        get: function() {
          return obj
        },
        set: function(newValue) {
          document.getElementById('txt').value = newValue
          document.getElementById('show').innerHTML = newValue
        }
      })
      document.addEventListener('keyup', function(e) {
        obj.content = e.target.value
      })
    </script>
    

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT瓜哥-杨得朝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值