淺談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.pswp.cn/news/248343.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248343.shtml
英文地址,請注明出處:http://en.pswp.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;后一個…