浅谈Vue之双向绑定

  VUE实现双向数据绑定的原理就是利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get)和设置属性值(set)的操作来实现的。那么Object.defineProperty究竟是该如何使用的呢?先看个例子

 

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head><body><div id="app"><h5 id="txtShow"></h5><input type="text" id="txt"></div><script>// mvvm 分为model(模型) view(视图) viewModel(视图模型)//  model 用来存储数据//  view  用来展示数据//  ViewModel 关联数据,和model实现双向绑定。// 通过Object.defineProperty 定义一个属性//  通过此方法为对象设置属性的时候 对象的属性值会包含一个get和set方法//  当修改对象值得时候回触发相应的函数调用//  参数一 需要定义属性的对象//  参数二 属性名字//  参数三 对象属性的修饰内容 //    在set方法中做一些处理,执行页面的刷新和回调var model = {}; //创建一个新对象var vm = '';Object.defineProperty(model, 'txt', {set: function (val) {console.log('设置属性值');console.log(val);vm = val;txtShow.innerHTML = this.txt;},get: function () {console.log('获取属性值');console.log(this);return vm;},enumerable: true, //可枚举,默认falseconfigurable: true //该属性描述符能够被改变,同时该属性也能从对应的对象上被删除。默认false
    })var txtShow = document.getElementById('txtShow'),txt = document.getElementById('txt');txt.onkeyup = function () {if (event.keyCode == 13) {model.txt = txt.value;}}</script>
</body></html>

 

  通过上面的代码我们可以看到,在控制台,无论是改变vm的值还是model.txt的值,所对应的的,对方的值也会相应的改变,由此,这里我们就实现了双向绑定。

  对于Object.defineProperty() ,大家应该都见过,只是认知的程度有所不同。

  根据MDN web docs 中解释说: Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

语法

Object.defineProperty(obj, prop, descriptor)

参数

obj
要在其上定义属性的对象。
prop
要定义或修改的属性的名称。
descriptor
将被定义或修改的属性描述符。

返回值

    被传递给函数的对象。

  该方法允许精确添加或修改对象的属性。通过赋值操作添加的普通属性是可枚举的,能够在属性枚举期间呈现出来(for...in 或 Object.keys 方法), 这些属性的值可以被改变,也可以被删除。这个方法允许修改默认的额外选项(或配置)。默认情况下,使用 Object.defineProperty() 添加的属性值是不可修改的。

  

  对象里目前存在的属性描述符有两种主要形式:数据描述符存取描述符数据描述符是一个具有值的属性,该值可能是可写的,也可能不是可写的。存取描述符是由getter-setter函数对描述的属性。描述符必须是这两种形式之一;不能同时是两者。

  数据描述符和存取描述符均具有以下可选键值:

configurable
当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为 falseconfigurable特性表示对象的属性是否可以被删除,以及除valuewritable特性外的其他特性是否可以被修改。
enumerable
当且仅当该属性的enumerabletrue时,该属性才能够出现在对象的枚举属性中。默认为 falseenumerable定义了对象的属性是否可以在 for...in 循环和 Object.keys() 中被枚举。

数据描述符同时具有以下可选键值

value
该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined
writable
当且仅当该属性的writabletrue时,value才能被赋值运算符改变。默认为 false

存取描述符同时具有以下可选键值

get
一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this对象(由于继承关系,这里的this并不一定是定义该属性的对象)。
默认为 undefined
set
一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。
默认为 undefined
描述符可同时具有的键值
  configurable enumerable valuewritable get  set
数据描述符 YES YES YES YES NO NO
存取描述符 YES YES NO NO YES YES

  如果一个描述符不具有value,writable,get 和 set 任意一个关键字,那么它将被认为是一个数据描述符。如果一个描述符同时有(value或writable)和(get或set)关键字,将会产生一个异常。

  记住,这些选项不一定是自身属性,如果是继承来的也要考虑。为了确认保留这些默认值,你可能要在这之前冻结 Object.prototype,明确指定所有的选项,或者通过 Object.create(null)__proto__属性指向null

  在日常运用中,那你需要明白:

var o = {};o.a = 1;
// 等同于 :
Object.defineProperty(o, "a", {value : 1,writable : true,configurable : true,enumerable : true
});// 另一方面,
Object.defineProperty(o, "a", { value : 1 });
// 等同于 :
Object.defineProperty(o, "a", {value : 1,writable : false,configurable : false,enumerable : false
});

  

下面的例子展示了如何实现一个自存档对象。 当设置temperature 属性时,archive 数组会获取日志条目。

function Archiver() {var temperature = null;var archive = [];Object.defineProperty(this, 'temperature', {get: function() {console.log('get!');return temperature;},set: function(value) {temperature = value;archive.push({ val: temperature });}});this.getArchive = function() { return archive; };
}var arc = new Archiver();
arc.temperature; // 'get!'
arc.temperature = 11;
arc.temperature = 13;
arc.getArchive(); // [{ val: 11 }, { val: 13 }]
  看到这个例子,你心中是不是有了些许想法?

  后面还有很多知识点,有需要的可以去MDN进行更加深入的了解,谢谢!

  

转载于:https://www.cnblogs.com/gitByLegend/p/10553793.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AtCoder】AGC017

A - Biscuits dp[i][0/1]表示当前和是偶数还是奇数&#xff0c;直接转移即可 #include <bits/stdc.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar( ) #define enter putchar…

SQL语法(1、安装操作)

1、数据库的系统概述及安装与基本使用 bilibili可查找安装视频百度了解一下 – 使用超级管理员登录 CONN sys/change_on_install AS SYSDBA ; – 创建c##scott用户 CREATE USER c##scott IDENTIFIED BY tiger ; – 为用户授权 GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE…

java 中文字符和unicode编码值相互转化

java 中文字符和unicode编码值相互转化 https://blog.csdn.net/u011366045/article/details/79235217 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/u011366045/article/details/792352171、引用工具 import com.alibaba.…

Object 及toString() 方法的重写

Object: 是所有的类的父类 &#xff0c;Object中所有的方法 &#xff0c; 子类都能使用 &#xff0c; 接口不是Object子类。 Person: /*将父类的equals方法 重写* 不改变父类的源代码 equals 比较内存地址* 比较两个成员变量 变量值相等 返回true 不等 返回false* 重…

SQL语法练习

SQL语法练习https://blog.csdn.net/qq_30764991/article/details/81952197员工表建表语句: CREATE TABLE EMP ( ENAME VARCHAR2(30), EMPNO NUMBER(5), DEPTNO NUMBER(5), JOB VARCHAR2(20), HIREDATE DATE, COMM NUMBER(6,2), SAL NUMBER(6,2) ); 部门表建表语句: CREATE TA…

第22章:MongoDB-聚合操作--聚合管道--$out

①$out$out&#xff1a;利用此操作可以将查询结果输出到指定的集合里面。②范例&#xff1a;将投影的结果输出到集合里③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳转载于:https://www.cnblogs.com/Lucky-stars/p/10555296.html

SQL简单查询

1、简单查询 使用Oracle sql developer使用前&#xff0c;必须开启的服务&#xff1a; 查询emp表上的数据&#xff1a; select * from emp; Null为空&#xff0c;空不代表等于没有&#xff0c;null&#xff01;0. 重新连接后&#xff0c;注意大小写及空格位&#xff01; 简…

实用小技巧(一):UIScrollView中上下左右滚动方向的判断

https://www.jianshu.com/p/93e8459b6dae 2017.06.01 01:13* 字数 674 阅读 1201评论 0喜欢 12017.06.01 01:13* 字数 674 阅读 1201评论 0喜欢 1 版本记录 版本号 时间 V1.0 2017.05.31 前言 ios中又很多实用的小技巧&#xff0c;实现不难很实用&#xff0c;以后我会慢慢的…

less.js

1.变量 2.混入 3.带参的混入 4.选择器的继承&#xff0c;貌似还不支持 5.嵌套规则 6.运算 7.颜色函数 8.条件语句与控制&#xff0c;貌似不支持 9.命名空间 10.注释 11.作用域 12.字符的插入 13.转义 14.JavaScript 的赋值转载于:https://www.cnblogs.com/I-am-fine/archive/20…

SQL限定查询

1、限定查询与排序显示 1.1限定查询的认识&#xff1a; 列&#xff1a;表中有大数据的信息&#xff0c;对数据进行筛选&#xff0c;查询到自己想要的信息。 &#xff08;数据过多显示过慢&#xff0c;或者死机&#xff0c;在已有的样本数据库容器CDB转换为PDB之中&#xff09;…

Centos6.10源码部署zabbix-3.2.6

环境&#xff1a;Centos6.10 已有lnmp环境 mysql5.7 php7.2 创建zabbix数据库 mysql> create database zabbix character set utf8 collate utf8_bin; mysql> grant all privileges on zabbix.* to zabbixlocalhost identified by zabbix; 创建zabbix用户 shell> …

浅谈五大Python Web框架

http://www.csdn.net/article/2011-02-17/292058 导读&#xff1a;作者飞龙写了一篇《浅谈Python Web框架》&#xff0c;文中他介绍了几个Python Web框架和自己对选择框架的分析。在他看来&#xff0c;用Django来快速开发一些Web运用是很不错的选择。以下是文章内容&#xff1a…

主流浏览器和内核及Web标准

目前网络市场的浏览器主流&#xff1a; 课时3&#xff1a;web标准 WEB标准 w3c 万维网联盟组织&#xff0c;制定web标准的机构。 网页主要由三部分组成&#xff1a; 结构&#xff08;Structure&#xff09;、 表现&#xff08;Presentation&#xff09; 行为&#xff08;Beh…

质量属性六个常见属性场景(《淘宝网》为例) 15

六个最常见的系统质量属性分别是&#xff1a;可用性&#xff08;Availability&#xff09;、可修改性&#xff08;Modifiability&#xff09;、性能&#xff08;Performance&#xff09;、安全性&#xff08;Security&#xff09;、可测试性&#xff08;Testability&#xff09…

机器学习中的损失函数 (着重比较:hinge loss vs softmax loss)

https://blog.csdn.net/u010976453/article/details/78488279 1. 损失函数 损失函数&#xff08;Loss function&#xff09;是用来估量你模型的预测值 f(x)f(x) 与真实值 YY 的不一致程度&#xff0c;它是一个非负实值函数&#xff0c;通常用 L(Y,f(x))L(Y,f(x)) 来表示。损失函…

HTML入门第一和第二章

课时4&#xff1a;HTML初识 1、英文名&#xff08;Hyper Text Markup Language&#xff09;超文本标签语言 对网页上的内容进行描述 课时5&#xff1a;HTML骨架 课时6&#xff1a;我的第一个页面及其标签简介 课时7&#xff1a;骨架记忆法 课时8&#xff1a;什么是标签及其分…

mysql 指令

// 授予用户某些权限GRANT ALL ON *.* TO USERHOST;// 进入mysql访问特定数据库mysql -u user -p database_name// 查看数据表结构DESCRIBE table_name;// 加载文本数据到tableLOAD DATA LOCAL INFILE file_path INTO TABLE table_name;// UPDATE语句UPDATE table_name SET col…

flex label 换行

Flex中label换行有两种情况 在AS中赋值&#xff1a; label.text"Online\r\nResources" 在mxml中赋值&#xff1a; text"OnlineResources" 在flash builder中就可以换行显示了。左右有四种对齐方式&#xff0c;上下四种对齐方式。 也就是说mx中的label不支持…

H5第一天

移动Web - 基础&流式布局 目标 了解移动端主要浏览器的内核掌握用谷歌浏览器调试移动端页面&#xff08;重要&#xff09;了解布局视口、视觉视口、理想视口使用mate标签设置理想视口&#xff08;重要&#xff09;了解视网膜屏、物理像素、二倍图会使用background-size设…

python数据结构之字典(未完成)

字典 dic {key:value} 1.字典特性 key必须是唯一的&#xff0c;值不必是唯一。 值可以是任何数据类型&#xff0c;比如list&#xff0c;tuple&#xff0c;字符&#xff0c;数值等。key只能是不可变的数据类型。 同一个key不允许重复&#xff0c;如果出现重复&#xff0c;后一个…