精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用ES6的新特性Proxy來實現(xiàn)一個數(shù)據(jù)綁定實例

開發(fā) 前端
作為一個前端開發(fā)者,曾踩了太多的“數(shù)據(jù)綁定”的坑。在早些時候,都是通過jQuery之類的工具手動完成這些功能,但是當(dāng)數(shù)據(jù)量非常大的時候,這些手動的工作讓我非常痛苦。直到使用了VueJS,這些痛苦才得以終結(jié)。

[[176173]]

作為一個前端開發(fā)者,曾踩了太多的“數(shù)據(jù)綁定”的坑。在早些時候,都是通過jQuery之類的工具手動完成這些功能,但是當(dāng)數(shù)據(jù)量非常大的時候,這些手動的工作讓我非常痛苦。直到使用了VueJS,這些痛苦才得以終結(jié)。

VueJS的其中一個賣點,就是“數(shù)據(jù)綁定”。使用者無需關(guān)心數(shù)據(jù)是怎么綁定到dom上面的,只需要關(guān)注數(shù)據(jù)就好,因為VueJS已經(jīng)自動幫我們完成了這些工作。

這真的非常神奇,我不可救藥地愛上了VueJS,并且把它用到我自己的項目當(dāng)中。隨著使用的深入,我更加想知道它深入的原理是什么。

VueJS是如何進(jìn)行數(shù)據(jù)綁定的?

通過閱讀官方文檔,我看到了下面這段話:

把一個普通 Javascript 對象傳給 Vue 實例來作為它的 data 選項,Vue 將遍歷它的屬性,用 Object.defineProperty 將它們轉(zhuǎn)為 getter/setter。

關(guān)鍵詞是Object.definProperty,在MDN文檔里面是這么說的:

Object.defineProperty()方法直接定義一個對象的屬性,或者修改對象當(dāng)中一個已經(jīng)存在的屬性,并返回這個對象。

讓我們寫個例子來測試一下它。

首先,建立一個鋼鐵俠對象并賦予他一些屬性:

  1. let ironman = { 
  2.   name'Tony Stark'
  3.   sex: 'male'
  4.   age: '35' 
  5.  

現(xiàn)在我們使用Object.defineProperty()方法來對他的一些屬性進(jìn)行修改,并且在控制臺把所修改的內(nèi)容輸出:

  1. Object.defineProperty(ironman, 'age', { 
  2.   set (val) { 
  3.     console.log(`Set age to ${val}`) 
  4.     return val 
  5.   } 
  6. }) 
  7.  
  8. ironman.age = '48' 
  9. // --> Set age to 48  

看起來挺完美的。如果把console.log('Set age to ${val}')改為element.innerHTML = val,是不是就意味著數(shù)據(jù)綁定已經(jīng)完成了呢?

讓我們再修改一下鋼鐵俠的屬性:

  1. let ironman = { 
  2.   name'Tony Stark'
  3.   sex: 'male'
  4.   age: '35'
  5.   hobbies: ['girl''money''game'
  6.  

嗯……他就是一個花花公子。現(xiàn)在我想把一些“愛好”添加到他身上,并且在控制臺看到對應(yīng)的輸出:

  1. Object.defineProperty(ironman.hobbies, 'push', { 
  2.   value () { 
  3.     console.log(`Push ${arguments[0]} to ${this}`) 
  4.     this[this.length] = arguments[0] 
  5.   } 
  6. }) 
  7.  
  8. ironman.hobbies.push('wine'
  9. console.log(ironman.hobbies) 
  10.  
  11. // --> Push wine to girl,money,game 
  12. // --> [ 'girl', 'money', 'game', 'wine' ]  

在此之前,我是使用get()方法去追蹤對象的屬性變化,但是對于一個數(shù)組,我們不能使用這個方法,而是使用value()方法來代替。雖然這招也靈,但是并非最好的辦法。有沒有更好的方法可以簡化這些追蹤對象或數(shù)組屬性變化的方法呢?

在ECMA2015,Proxy是一個不錯的選擇

什么是Proxy?在MDN文檔中是這么說的(誤):

Proxy可以理解成,在目標(biāo)對象之前架設(shè)一層“攔截”,外界對該對象的訪問,都必須先通過這層攔截,因此提供了一種機制,可以對外界的訪問進(jìn)行過濾和改寫。

Proxy是ECMA2015的一個新特性,它非常強大,但我并不會討論太多關(guān)于它的東西,除了我們現(xiàn)在需要的一個。現(xiàn)在讓我們一起來新建一個Proxy實例:

  1. let ironmanProxy = new Proxy(ironman, { 
  2.   set (target, property, value) { 
  3.     target[property] = value 
  4.     console.log('change....'
  5.     return true 
  6.   } 
  7. }) 
  8.  
  9. ironmanProxy.age = '48' 
  10. console.log(ironman.age) 
  11.  
  12. // --> change.... 
  13. // --> 48  

符合預(yù)期。那么對于數(shù)組呢?

  1. let ironmanProxy = new Proxy(ironman.hobbies, { 
  2.   set (target, property, value) { 
  3.     target[property] = value 
  4.     console.log('change....'
  5.     return true 
  6.   } 
  7. }) 
  8.  
  9. ironmanProxy.push('wine'
  10. console.log(ironman.hobbies) 
  11.  
  12. // --> change... 
  13. // --> change... 
  14. // --> [ 'girl', 'money', 'game', 'wine' ]  

仍然符合預(yù)期!但是為什么輸出了兩次change...呢?因為每當(dāng)我觸發(fā)push()方法的時候,這個數(shù)組的length屬性和body內(nèi)容都被修改了,所以會引起兩次變化。

實時數(shù)據(jù)綁定

解決了最核心的問題,可以考慮其他的問題了。

想象一下,我們有一個模板和數(shù)據(jù)對象:

  1. <!-- html template --> 
  2. <p>Hello, my name is {{name}}, I enjoy eatting {{hobbies.food}}</p> 
  3.  
  4. <!-- javascript --> 
  5. let ironman = { 
  6.   name'Tony Stark'
  7.   sex: 'male'
  8.   age: '35'
  9.   hobbies: { 
  10.     food: 'banana'
  11.     drink: 'wine' 
  12.   } 
  13.  

通過前面的代碼,我們知道如果想要追蹤一個對象的屬性變化,我們應(yīng)該把這個屬性作為第一個參數(shù)傳入Proxy實例。讓我們一起來創(chuàng)建一個返回新的Proxy實例的函數(shù)吧! 

  1. function $setData (dataObj, fn) { 
  2.     let self = this 
  3.     let once = false 
  4.     let $d = new Proxy(dataObj, { 
  5.       set (target, property, value) { 
  6.         if (!once) { 
  7.           target[property] = value 
  8.           once = true 
  9.           /* Do something here */ 
  10.         } 
  11.         return true 
  12.       } 
  13.     }) 
  14.     fn($d) 
  15.   }  

它可以通過以下的方式被使用:

  1. $setData(dataObj, ($d) => { 
  2.   /*  
  3.    * dataObj.someProps = something 
  4.    */ 
  5. }) 
  6.  
  7. // 或者 
  8.  
  9. $setData(dataObj.arrayProps, ($d) => { 
  10.   /*  
  11.    * dataObj.push(something) 
  12.    */ 
  13. })  

除此之外,我們應(yīng)該實現(xiàn)模板對數(shù)據(jù)對象的映射,這樣才能用Tony Stark來替換{{name}}。

  1. function replaceFun(str, data) { 
  2.     let self = this 
  3.     return str.replace(/{{([^{}]*)}}/g, (a, b) => { 
  4.       return data[b] 
  5.     }) 
  6.   } 
  7.  
  8. replaceFun('My name is {{name}}', { name'xxx' }) 
  9. // --> My name is xxx  

這個函數(shù)對于如{ name: 'xx', age: 18 }的單層屬性對象運行良好,但是對于如{ hobbies: { food: 'apple', drink: 'milk' } }這樣的多層屬性對象卻無能為力。舉個例子,如果模板關(guān)鍵字是{{hobbies.food}},那么replaceFun()函數(shù)就應(yīng)該返回data['hobbies']['food']。

為了解決這個問題,再來一個函數(shù):

  1. function getObjProp (obj, propsName) { 
  2.     let propsArr = propsName.split('.'
  3.     function rec(o, pName) { 
  4.       if (!o[pName] instanceof Array && o[pName] instanceof Object) { 
  5.         return rec(o[pName], propsArr.shift()) 
  6.       } 
  7.       return o[pName] 
  8.     } 
  9.     return rec(obj, propsArr.shift()) 
  10.   } 
  11.  
  12. getObjProp({ data: { hobbies: { food: 'apple', drink: 'milk' } } }, 'hobbies.food'
  13. // --> return  { food: 'apple', drink: 'milk' }  

最終的replaceFun()函數(shù)應(yīng)該是下面這樣子的: 

  1. function replaceFun(str, data) { 
  2.     let self = this 
  3.     return str.replace(/{{([^{}]*)}}/g, (a, b) => { 
  4.       let r = self._getObjProp(data, b); 
  5.       console.log(a, b, r) 
  6.       if (typeof r === 'string' || typeof r === 'number') { 
  7.         return r 
  8.       } else { 
  9.         return self._getObjProp(r, b.split('.')[1]) 
  10.       } 
  11.     }) 
  12.   }  

一個數(shù)據(jù)綁定的實例,叫做“Mog”

不為什么,就叫做“Mog”。

  1. class Mog { 
  2.   constructor (options) { 
  3.     this.$data = options.data 
  4.     this.$el = options.el 
  5.     this.$tpl = options.template 
  6.     this._render(this.$tpl, this.$data) 
  7.   } 
  8.  
  9.   $setData (dataObj, fn) { 
  10.     let self = this 
  11.     let once = false 
  12.     let $d = new Proxy(dataObj, { 
  13.       set (target, property, value) { 
  14.         if (!once) { 
  15.           target[property] = value 
  16.           once = true 
  17.           self._render(self.$tpl, self.$data) 
  18.         } 
  19.         return true 
  20.       } 
  21.     }) 
  22.     fn($d) 
  23.   } 
  24.  
  25.   _render (tplString, data) { 
  26.     document.querySelector(this.$el).innerHTML = this._replaceFun(tplString, data) 
  27.   } 
  28.  
  29.   _replaceFun(str, data) { 
  30.     let self = this 
  31.     return str.replace(/{{([^{}]*)}}/g, (a, b) => { 
  32.       let r = self._getObjProp(data, b); 
  33.       console.log(a, b, r) 
  34.       if (typeof r === 'string' || typeof r === 'number') { 
  35.         return r 
  36.       } else { 
  37.         return self._getObjProp(r, b.split('.')[1]) 
  38.       } 
  39.     }) 
  40.   } 
  41.  
  42.   _getObjProp (obj, propsName) { 
  43.     let propsArr = propsName.split('.'
  44.     function rec(o, pName) { 
  45.       if (!o[pName] instanceof Array && o[pName] instanceof Object) { 
  46.         return rec(o[pName], propsArr.shift()) 
  47.       } 
  48.       return o[pName] 
  49.     } 
  50.     return rec(obj, propsArr.shift()) 
  51.   } 
  52.  
  53.  

使用: 

  1. <!-- html --> 
  2.  
  3.     <div id="app"
  4.       <p> 
  5.         Hello everyone, my name is <span>{{name}}</span>, I am a mini <span>{{lang}}</span> framework for just <span>{{work}}</span>. I can bind data from <span>{{supports.0}}</span>, <span>{{supports.1}}</span> and <span>{{supports.2}}</span>. What's more, I was created by <span>{{info.author}}</span>, and was written in <span>{{info.jsVersion}}</span>. My motto is "<span>{{motto}}</span>"
  6.       </p> 
  7.     </div> 
  8.     <div id="input-wrapper"
  9.       Motto: <input type="text" id="set-motto" autofocus>     </div>   
  1. <!-- javascript --> 
  2.  
  3. let template = document.querySelector('#app').innerHTML 
  4.  
  5. let mog = new Mog({ 
  6.   template: template, 
  7.   el: '#app'
  8.   data: { 
  9.     name'mog'
  10.     lang: 'javascript'
  11.     work'data binding'
  12.     supports: ['String''Array''Object'], 
  13.     info: { 
  14.       author: 'Jrain'
  15.       jsVersion: 'Ecma2015' 
  16.     }, 
  17.     motto: 'Every dog has his day' 
  18.   } 
  19. }) 
  20.  
  21. document.querySelector('#set-motto').oninput = (e) => { 
  22.   mog.$setData(mog.$data, ($d) => { 
  23.     $d.motto = e.target.value 
  24.   }) 
  25.  

你可以在這里進(jìn)行在線體驗。

后記

Mog僅僅是一個用于學(xué)習(xí)數(shù)據(jù)綁定的實驗性質(zhì)的項目,代碼仍然不夠優(yōu)雅,功能也不夠豐富。但是這個小玩具讓我學(xué)習(xí)了很多。如果你對它有興趣,歡迎到這里把項目fork走,并且加入一些你的想法。

感謝閱讀!

責(zé)任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2023-11-23 10:21:11

ECMAScriptJavaScript

2017-08-31 14:25:34

前端JavascriptES6

2020-07-01 07:58:20

ES6JavaScript開發(fā)

2016-01-21 11:05:52

ES6JavaScript新特性

2025-11-19 08:23:37

2021-12-13 11:54:13

SetEs6接口

2023-03-01 15:39:50

JavaScrip對象屬性ES6

2023-05-28 23:49:38

JavaScrip開發(fā)

2022-06-01 09:06:58

ES6數(shù)組函數(shù)

2020-02-06 09:00:00

ESES2020前端

2024-05-09 08:08:32

SpringBinderJava

2012-12-20 11:16:16

IBMdW

2022-08-05 13:14:25

ES2022JavaScript代碼

2009-11-02 15:15:43

Oracle授予用戶權(quán)

2012-06-13 10:26:21

iOS 6

2015-09-16 10:17:42

Node.jsES 6特性

2021-09-01 10:37:25

鴻蒙HarmonyOS應(yīng)用

2024-06-18 08:46:06

2021-07-21 05:22:12

Webpack 前端 JavaScript

2017-06-03 15:43:54

數(shù)據(jù)項目框架
點贊
收藏

51CTO技術(shù)棧公眾號

欧美黄色小视频| 91精品麻豆日日躁夜夜躁| 久久久精品国产一区二区三区| 成人免费看片98欧美| 精品国产一区二区三区四区 | 99久久99九九99九九九| 亚洲综合视频网| 欧美人xxxxx| 精品黑人一区二区三区国语馆| 一本一道久久综合狠狠老精东影业| 伊人精品在线观看| 色综合久久五月| 婷婷久久免费视频| 欧美性极品少妇精品网站| 亚洲最新在线| 激情福利在线| 成人午夜电影网站| 91夜夜揉人人捏人人添红杏| 黄色片免费观看视频| 亚洲免费二区| 中文综合在线观看| 特级西西人体4444xxxx| 久久久91麻豆精品国产一区| 色综合天天综合狠狠| 欧美 亚洲 视频| 午夜伦全在线观看| 91免费精品国自产拍在线不卡| 91久久国产精品| 亚洲成人av影片| 国产欧美一区二区色老头| 欧美成人激情在线| 999久久久国产| 欧洲专线二区三区| 亚洲黄色www| 久久久久久久穴| 91精品一久久香蕉国产线看观看| 在线观看日韩毛片| 日本xxxxxxx免费视频| 竹内纱里奈兽皇系列在线观看| 亚洲精品日韩一| 亚洲天堂av免费在线观看| 国产资源在线观看| 久久久综合激的五月天| 国产青春久久久国产毛片| 精品人妻久久久久一区二区三区| 久久精品99国产精品| 国产精品一区二区三区成人| 91porny九色| 久久一二三四| 日本sm极度另类视频| www.毛片.com| 国产精品五区| 人九九综合九九宗合| 91美女免费看| 国产精品视频| 国产精品扒开腿做| 亚洲天堂网在线观看视频| 日本欧美一区二区| 国产欧洲精品视频| 国产精品一区二区黑人巨大 | 一级欧洲+日本+国产| 日韩视频在线观看免费| 天天鲁一鲁摸一摸爽一爽| 亚洲精品a级片| 欧美福利视频在线观看| 豆国产97在线 | 亚洲| 最新日韩av| 69精品小视频| 中文字幕乱伦视频| 国产一区二区不卡在线| 97人人干人人| 日韩在线无毛| 国产精品丝袜一区| 91精品国产吴梦梦| segui88久久综合9999| 色综合天天综合在线视频| 久草福利视频在线| 99久久久国产| 精品日韩成人av| 欧美 变态 另类 人妖| 精品国产一区二区三区噜噜噜| 伊人伊成久久人综合网小说 | 黄色片在线看| 日韩美女久久久| 人妻夜夜添夜夜无码av| 成人午夜视屏| 欧美乱熟臀69xxxxxx| 91丨porny丨九色| 女同另类激情重口| 在线日韩第一页| 久久97人妻无码一区二区三区| 亚洲国产婷婷| 国产精品主播视频| 成人毛片视频免费看| 国产色一区二区| av动漫在线播放| 欧美影视资讯| 精品国产免费一区二区三区香蕉| 国产sm调教视频| 亚洲特色特黄| 国产精品视频自在线| 蜜桃视频久久一区免费观看入口| 国产欧美精品一区aⅴ影院| 国产日韩欧美大片| 三级成人在线| 亚洲成人国产精品| а天堂中文在线资源| 国产农村妇女毛片精品久久莱园子 | 亚洲一区999| 黄色一级免费视频| 免费在线观看视频一区| 国产欧美日韩一区| 黄网站在线免费| 在线观看视频一区二区| 国产chinese中国hdxxxx| 色999国产精品| 欧美在线视频一区二区| www.久久成人| 中文字幕欧美一区| 免费激情视频在线观看| 国产精品22p| 操日韩av在线电影| 自拍偷拍精品视频| 久久久久久夜精品精品免费| www.日本少妇| 欧美激情精品| 久久综合电影一区| 91在线视频国产| 国产日产欧美一区二区视频| 免费看黄在线看| 亚洲一区二区三区中文字幕在线观看| 久久精品99久久久香蕉| 综合久久中文字幕| 欧美国产日韩亚洲一区| av天堂永久资源网| 青草久久视频| 5278欧美一区二区三区| 日本高清视频免费观看| 一区二区三区欧美视频| 国产性生活一级片| 99精品美女| 91精品免费看| a视频在线观看| 日韩一区二区三区视频| 情侣偷拍对白清晰饥渴难耐| 免费成人美女在线观看| 水蜜桃亚洲一二三四在线| **在线精品| 国产亚洲a∨片在线观看| 欧美成人一区二区三区四区| 久久一区二区三区四区| 激情网站五月天| 久久av网址| 国产精品久久久久久久久粉嫩av| www 日韩| 91精品国产综合久久久蜜臀粉嫩 | 国产老熟女伦老熟妇露脸| 91久久视频| 另类欧美小说| 澳门av一区二区三区| 影音先锋日韩有码| 国产精品视频第一页| 亚洲乱码国产乱码精品精98午夜| 绯色av蜜臀vs少妇| 精品电影一区| 欧美日韩精品久久| 日韩成人精品一区二区三区| 日韩一区二区精品视频| 国产成人av免费看| 污片在线观看一区二区| 中文字幕国产专区| 麻豆久久久久久| 国产制服91一区二区三区制服| 高清日韩欧美| 日韩av免费看网站| 欧美13一16娇小xxxx| 日韩一区二区精品| 天天操中文字幕| 中文一区在线播放| 97免费公开视频| 国产日韩欧美一区二区三区在线观看| 日韩高清三级| 中文在线综合| 国产精品视频成人| 色呦呦网站在线观看| 亚洲女人天堂色在线7777| 国产天堂第一区| 亚洲精品日韩专区silk| theav精尽人亡av| 精品一区二区三区在线播放视频| 夜夜添无码一区二区三区| 国产欧美一区二区精品久久久| 亚洲iv一区二区三区| 成人免费看黄| 欧美猛交免费看| 国产在线中文字幕| 精品女同一区二区| 中文av免费观看| 精品久久久久久久久久久久久| 91导航在线观看| 99久久免费国产| 妖精视频在线观看| 蜜臀av一区二区| 男女激情无遮挡| 在线一区电影| 亚洲黄色一区二区三区| 国产一区二区在线视频你懂的| 国产九九精品视频| 深夜福利视频一区二区| 欧美久久久精品| 99se视频在线观看| 日韩av在线免播放器| 精品国产av鲁一鲁一区| 欧美性猛交xxxxxxxx| 日本少妇在线观看| 一区二区在线看| 免费看一级黄色| 国产网站一区二区三区| 性久久久久久久久久久| 国产**成人网毛片九色| 精品综合久久久久| 日韩精品一二三| 亚洲国产精品久久久久爰色欲| 欧美日韩国产综合网| 欧美 日韩 国产 在线观看| 国产不卡一区| 免费日韩av电影| 欧美电影在线观看完整版| 99国产在线观看| 青草伊人久久| 成人有码在线播放| 婷婷久久综合九色综合99蜜桃| 国产精品久久久久久av福利| 一区二区精品伦理... | 亚洲男人的天堂在线视频| 亚洲电影中文字幕在线观看| 久久国产精品国语对白| 亚洲欧美视频在线观看| 性欧美疯狂猛交69hd| 亚洲欧洲日韩综合一区二区| www.涩涩爱| 国产精品对白交换视频| 懂色av粉嫩av蜜臀av一区二区三区| 久久精品人人爽人人爽| av中文字幕免费观看| 99久久国产综合精品色伊| 免费的av网站| 久久奇米777| 精品无码国产污污污免费网站| 久久久www免费人成精品| 欧美老熟妇乱大交xxxxx| 久久亚洲一区二区三区明星换脸| 少妇真人直播免费视频| 国产网红主播福利一区二区| 少妇av片在线观看| 国产精品久久久久aaaa樱花| 国产精品夜夜夜爽阿娇| 亚洲欧洲综合另类| 久久精品视频9| 亚欧色一区w666天堂| 日韩黄色在线播放| 欧美性做爰猛烈叫床潮| 国产口爆吞精一区二区| 欧美xxxx老人做受| 五月婷在线视频| 亚洲天堂色网站| 麻豆网站在线看| 欧美激情一区二区三区久久久 | 国产高清自拍视频在线观看| 最新亚洲国产精品| 污污网站在线看| 91sao在线观看国产| 久久久人成影片一区二区三区在哪下载| 国产精品美女av| 91精品啪在线观看国产爱臀| 精品日本一区二区三区在线观看| 九九综合久久| 亚洲精品国产suv一区88| 一本一本久久| 亚洲欧美偷拍另类| gogo大胆日本视频一区| 自拍偷拍你懂的| 亚洲高清免费在线| 瑟瑟视频在线免费观看| 欧美r级电影在线观看| 日本ー区在线视频| 欧美成人激情图片网| 中文字幕一区久| 亚洲精品欧美一区二区三区| 神马香蕉久久| 99精品一级欧美片免费播放| 一本不卡影院| 中文 日韩 欧美| 久久久久久久久久久99999| 国产精品成人69xxx免费视频| 天天影视网天天综合色在线播放| 国产一区二区三区中文字幕| 亚洲精品美女在线观看| 巨大荫蒂视频欧美另类大| 欧洲亚洲妇女av| 日韩免费一级| 亚洲欧洲一二三| 久久国产精品久久久久久电车| 中文字幕亚洲影院| 久久精品男人天堂av| 国产精品自拍视频一区| 欧美老肥妇做.爰bbww| 青春有你2免费观看完整版在线播放高清 | 99高清视频有精品视频| 日韩成人a**站| 国产极品粉嫩福利姬萌白酱| 国产在线播放一区| 极品人妻videosss人妻| 高潮白浆女日韩av免费看| 精品久久久久成人码免费动漫| 中文字幕在线观看亚洲| 浪潮色综合久久天堂 | 国产小视频在线播放| 久久免费观看视频| 日韩中文一区二区| 亚洲国产精品女人| 蜜芽一区二区三区| 妺妺窝人体色WWW精品| 黑人巨大精品欧美一区二区一视频 | 日韩电影免费在线| 国产精品300页| 香港成人在线视频| 丰满少妇一级片| 欧美激情视频一区二区三区不卡| 白嫩亚洲一区二区三区| 亚洲精品中文字幕在线| 麻豆视频观看网址久久| 九九热免费在线| 欧美午夜片在线观看| 国外av在线| 国产精品99久久久久久久久| 亚洲国产网址| 日韩手机在线观看视频| 久久免费看少妇高潮| 日韩视频在线观看一区| 日韩毛片中文字幕| 自拍视频在线看| 欧美在线播放一区| 日韩电影在线看| 少妇视频在线播放| 8x福利精品第一导航| 国产黄色在线网站| 99国产视频| 国产视频一区三区| 久久中文字幕人妻| 在线视频欧美精品| 丝袜美腿美女被狂躁在线观看| 91精品国产综合久久香蕉| 亚洲乱码在线| 稀缺呦国内精品呦| 一本一道综合狠狠老| av中文字幕一区二区三区| 国产精品视频一区二区三区四 | 国产免费不卡av| 欧美老女人性视频| 欧美一级色片| 日本爱爱免费视频| 成人免费一区二区三区在线观看| 国产黄色免费大片| 欧美亚洲另类在线| 久久国产精品亚洲人一区二区三区 | 菠萝蜜视频在线观看一区| 国产精品999在线观看| 国产亚洲xxx| 国产一区二区av在线| 日本男女交配视频| 久久久久久**毛片大全| 一级片aaaa| 久久久日本电影| 国产一区二区三区四区五区传媒| 日韩精品视频一二三| 亚洲综合久久久久| 国产专区在线| 成人免费视频网站入口| 欧美亚洲自偷自偷| 波多野结衣久久久久| 亚洲精品国产品国语在线| 日韩一区二区三区在线免费观看 | 亚洲精品色婷婷福利天堂| 99久久久国产精品免费调教网站| 裸体裸乳免费看| 久久综合av免费| 国产成人三级在线播放 | 久久久精品天堂| 国产成人精品a视频| 日韩美女在线观看一区| 国产精品黑丝在线播放| 欧美精品欧美极品欧美激情| 欧美日韩国产综合一区二区三区| 福利写真视频网站在线| 亚洲一卡二卡| 久久蜜桃av一区精品变态类天堂 | 亚洲人成在线观看网站高清| 国产激情精品一区二区三区| wwwxxx黄色片|