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

javascript原生一步步實現bind分析

開發 前端
bind() 函數會創建一個新函數(稱為綁定函數),新函數與被調函數(綁定函數的目標函數)具有相同的函數體(在 ECMAScript 5 規范中內置的call屬性)。當目標函數被調用時 this 值綁定到 bind() 的第一個參數,該參數不能被重寫。綁定函數被調用時,bind() 也接受預設的參數提供給原函數。

[[175195]]

bind

官方描述

bind() 函數會創建一個新函數(稱為綁定函數),新函數與被調函數(綁定函數的目標函數)具有相同的函數體(在 ECMAScript 5 規范中內置的call屬性)。當目標函數被調用時 this 值綁定到 bind() 的***個參數,該參數不能被重寫。綁定函數被調用時,bind() 也接受預設的參數提供給原函數。一個綁定函數也能使用new操作符創建對象:這種行為就像把原函數當成構造器。提供的 this 值被忽略,同時調用時的參數被提供給模擬函數。

使用介紹

由于javascript中作用域是由其運行時候所處的環境決定的,所以往往函數定義和實際運行的時候所處環境不一樣,那么作用域也會發生相應的變化。

例如下面這個情況:

  1. var id = 'window'
  2. //定義一個函數,但是不立即執行 
  3. var test = function(){ 
  4.     console.log(this.id) 
  5. test() // window 
  6. //把test作為參數傳遞 
  7. var obj = { 
  8.     id:'obj'
  9.     hehe:test 
  10. //此時test函數運行環境發生了改變 
  11. obj.hehe() // 'obj' 
  12. //為了避免這種情況,javascript里面有一個bind方法可以在函數運行之前就綁定其作用域,修改如下 
  13.  
  14. var id = 'window'
  15. var test = function(){ 
  16.     console.log(this.id) 
  17. }.bind(window) 
  18. var obj = { 
  19.     id:'obj'
  20.     hehe:test 
  21. test() // window 
  22. obj.hehe() // window  

上面介紹了bind方法的一個重要作用就是為一個函數綁定作用域,但是bind方法在低版本瀏覽器不兼容,這里我們可以手動實現一下。

拆分一下關鍵思路

  1. 因為bind方法不會立即執行函數,需要返回一個待執行的函數(這里用到閉包,可以返回一個函數)return function(){}
  2. 作用域綁定,這里可以使用apply或者call方法來實現 xx.call(yy)/xx.apply(yy)
  3. 參數傳遞,由于參數的不確定性,需要用apply傳遞數組(實例更明了)xx.apply(yy,[...Array...]),如果用call就不太方便了,因為call后面的參數需要一個個列出來

實現

有了上述的思路,大致的雛形已經明了了,代碼應該也很容易實現

綁定作用域,綁定傳參

  1. Function.prototype.testBind = function(that){ 
  2.     var _this = this, 
  3.         /* 
  4.         *由于參數的不確定性,統一用arguments來處理,這里的arguments只是一個類數組對象,有length屬性 
  5.         *可以用數組的slice方法轉化成標準格式數組,除了作用域對象that以外, 
  6.         *后面的所有參數都需要作為數組參數傳遞 
  7.         *Array.prototype.slice.apply(arguments,[1])/Array.prototype.slice.call(arguments,1) 
  8.         */ 
  9.         slice = Array.prototype.slice, 
  10.         args = slice.apply(arguments,[1]); 
  11.     //返回函數     
  12.     return function(){ 
  13.         //apply綁定作用域,進行參數傳遞 
  14.         return _this.apply(that,args) 
  15.     }     
  16.  

測試

  1. var test = function(a,b){ 
  2.     console.log('作用域綁定 '+ this.value) 
  3.     console.log('testBind參數傳遞 '+ a.value2) 
  4.     console.log('調用參數傳遞 ' + b) 
  5. var obj = { 
  6.     value:'ok' 
  7. var fun_new = test.testBind(obj,{value2:'also ok'}) 
  8.  
  9. fun_new ('hello bind'
  10. // 作用域綁定 ok 
  11. // testBind參數傳遞 also ok 
  12. // 調用參數傳遞  undefined  

動態參數

上面已經實現了bind方法的作用域綁定,但是美中不足的是,既然我們返回的是一個函數,調用的時候應該支持傳遞參數,很顯然,上面的 fun_new 調用的時候并不支持傳參,只能在 testBind 綁定的時候傳遞參數,因為我們最終調用的是這個返回函數

  1. function(){ 
  2.         return _this.apply(that,args) 
  3.     }     
  4.  
  5. 這里面的args在綁定的時候就已經確定了,調用的時候值已經固定, 
  6. 我們并沒有處理這個function傳遞的參數。  

我們對其進行改造

  1. return function(){ 
  2.         return _this.apply(that, 
  3.             args.concat(Array.prototype.slice.apply(arguments,[0])) 
  4.         ) 
  5.     }      

這里的 Array.prototype.slice.apply(arguments,[0]) 指的是這個返回函數執行的時候傳遞的一系列參數,所以是從***個參數開始 [0] ,之前的args = slice.apply(arguments,[1])指的是 testBind方法執行時候傳遞的參數,所以從第二個開始 [1],兩則有本質區別,不能搞混,只有兩者合并了之后才是返回函數的完整參數

所以有如下實現

  1. Function.prototype.testBind = function(that){ 
  2.     var _this = this, 
  3.         slice = Array.prototype.slice, 
  4.         args = slice.apply(arguments,[1]); 
  5.     return function(){ 
  6.         return _this.apply(that, 
  7.                     args.concat(Array.prototype.slice.apply(arguments,[0])) 
  8.                 ) 
  9.     }     
  10.  

測試

  1. var test = function(a,b){ 
  2.     console.log('作用域綁定 '+ this.value) 
  3.     console.log('testBind參數傳遞 '+ a.value2) 
  4.     console.log('調用參數傳遞 ' + b) 
  5. var obj = { 
  6.     value:'ok' 
  7. var fun_new = test.testBind(obj,{value2:'also ok'}) 
  8.  
  9. fun_new ('hello bind'
  10. // 作用域綁定 ok 
  11. // testBind參數傳遞 also ok 
  12. // 調用參數傳遞  hello bind  

在以上2種傳參方式中,bind的優先級高,從 args.concat(Array.prototype.slice.apply(arguments,[0])) 也可以看出來,bind的參數在數組前面。

原型鏈

官方文檔上有一句話:

A bound function may also be constructed using the new operator: doing

so acts as though the target function had instead been constructed.

The provided this value is ignored, while prepended arguments are

provided to the emulated function.

說明綁定過后的函數被new實例化之后,需要繼承原函數的原型鏈方法,且綁定過程中提供的this被忽略(繼承原函數的this對象),但是參數還是會使用。

這里就需要一個中轉函數把原型鏈傳遞下去

  1. fNOP = function () {} //創建一個中轉函數 
  2. fNOP.prototype = this.prototype; 
  3. xx.prototype = new fNOP()  
  4. 修改如下 
  5. Function.prototype.testBind = function(that){ 
  6.     var _this = this, 
  7.         slice = Array.prototype.slice, 
  8.         args = slice.apply(arguments,[1]), 
  9.         fNOP = function () {}, 
  10.         //所以調用官方bind方法之后 有一個name屬性值為 'bound ' 
  11.         bound = function(){ 
  12.             return _this.apply(that, 
  13.                 args.concat(Array.prototype.slice.apply(arguments,[0])) 
  14.             ) 
  15.         }     
  16.  
  17.     fNOP.prototype = _this.prototype; 
  18.  
  19.     bound.prototype = new fNOP(); 
  20.  
  21.     return bound; 
  22.  

而且bind方法的***個參數this是可以不傳的,需要分2種情況

  • 直接調用bind之后的方法
  1. var f = function () { console.log('不傳默認為'+this)  };f.bind()() 
  2. // 不傳默認為 Window   

所以直接調用綁定方法時候 apply(that, 建議改為 apply(that||window,,其實不改也可以,因為不傳默認指向window

  • 使用new實例化被綁定的方法

容易糊涂,重點在于弄清楚標準的bind方法在new的時候做的事情,然后就可以清晰的實現

這里我們需要看看 new 這個方法做了哪些操作 比如說 var a = new b()

  1. 創建一個空對象 a = {},并且this變量引用指向到這個空對象a
  2. 繼承被實例化函數的原型 :a.__proto__ = b.prototype
  3. 被實例化方法b的this對象的屬性和方法將被加入到這個新的 this 引用的對象中: b的屬性和方法被加入的 a里面
  4. 新創建的對象由 this 所引用 :b.call(a)

通過以上可以得知,如果是var after_new = new bindFun(); 由于這種行為是把原函數當成構造器,那么那么最終實例化之后的對象this需要繼承自原函數, 而這里的 bindFun 目前是

  1. function(){ 
  2.             return _this.apply(that || window, 
  3.                 args.concat(Array.prototype.slice.apply(arguments,[0])) 
  4.             ) 
  5.         }      

這里apply的作用域是綁定的that || window,在執行 testBind()的時候就已經固定,并沒有把原函數的this對象繼承過來,不符合我們的要求,我們需要根據apply的特性解決這個問題:

在一個子構造函數中,你可以通過調用父構造函數的 `apply/call` 方法來實現繼承

例如

  1. function Product(name, price) { 
  2.   this.name = name
  3.   this.price = price; 
  4.  
  5.   if (price < 0) { 
  6.     throw RangeError('Cannot create product ' + 
  7.                       this.name + ' with a negative price'); 
  8.   } 
  9.  
  10. function Food(name, price) { 
  11.   Product.call(this, name, price);  
  12.   this.category = 'food'
  13.  
  14. //等同于(其實就是把Product放在Food內部執行了一次) 
  15. function Food(name, price) {  
  16.     this.name = name
  17.     this.price = price; 
  18.     if (price < 0) { 
  19.         throw RangeError('Cannot create product ' + 
  20.                 this.name + ' with a negative price'); 
  21.     } 
  22.  
  23.     this.category = 'food';  
  24.  

所以在new新的實例的時候實時將這個新的this對象 進行 apply 繼承原函數的 this 對象,就可以達到 new 方法里面的第 3 步的結果

  1. apply(that||window, 
  2. //修改為 如果是new的情況,需要綁定new之后的作用域,this指向新的實例對象 
  3. apply(isNew ? this : that||window,  ==> 
  4.  
  5. Function.prototype.testBind = function(that){ 
  6.     var _this = this, 
  7.         slice = Array.prototype.slice, 
  8.         args = slice.apply(arguments,[1]), 
  9.         fNOP = function () {}, 
  10.         //所以調用官方bind方法之后 有一個name屬性值為 'bound ' 
  11.         bound = function(){ 
  12.             return _this.apply(isNew ? this : that||window, 
  13.                 args.concat(Array.prototype.slice.apply(arguments,[0])) 
  14.             ) 
  15.         }     
  16.  
  17.     fNOP.prototype = _this.prototype; 
  18.  
  19.     bound.prototype = new fNOP(); 
  20.  
  21.     return bound; 
  22.  

這里的 isNew 是區分 bindFun 是直接調用還是被 new 之后再調用,通過原型鏈的繼承關系可以知道,

bindFun 屬于 after_new的父類,所以 after_new instanceof bindFun 為 true,同時

bindFun.prototype = new fNOP() 原型繼承; 所以 fNOP 也是 after_new的父類, after_new instanceof fNOP 為 true

最終結果

  1. Function.prototype.testBind = function(that){ 
  2.         var _this = this, 
  3.             slice = Array.prototype.slice, 
  4.             args = slice.apply(arguments,[1]), 
  5.             fNOP = function () {}, 
  6.             bound = function(){ 
  7.                 //這里的this指的是調用時候的環境 
  8.                 return _this.apply(this instanceof  fNOP ? this : that||window, 
  9.                     args.concat(Array.prototype.slice.apply(arguments,[0])) 
  10.                 ) 
  11.             }     
  12.         fNOP.prototype = _this.prototype; 
  13.      
  14.         bound.prototype = new fNOP(); 
  15.      
  16.         return bound; 
  17.     }  

我看到有些地方寫的是

  1. this instanceof fNOP && that ? this : that || window, 

我個人覺得這里有點不正確,如果綁定時候不傳參數,那么that就為空,那無論怎樣就只能綁定 window作用域了。

以上是個人見解,不對的地方望指導,謝謝!

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2017-01-19 21:08:33

iOS路由構建

2019-07-09 15:23:22

Docker存儲驅動

2019-03-05 14:09:27

Docker存儲容器

2018-12-24 10:04:06

Docker存儲驅動

2020-12-24 11:19:55

JavaMapHashMap

2010-03-04 16:28:17

Android核心代碼

2017-12-25 11:50:57

LinuxArch Linux

2023-09-07 11:09:59

連接池本地端口號

2011-05-10 10:28:55

2024-08-30 08:30:29

CPU操作系統寄存器

2024-09-30 09:56:59

2024-08-06 09:29:54

程序機器指令字符串

2018-06-11 15:30:12

2009-12-17 16:36:23

無線路由設置密碼

2018-04-23 14:23:12

2018-07-13 15:36:52

2025-09-30 09:40:33

2025-02-08 08:21:48

Java排序Spring

2019-04-01 10:15:02

2017-01-06 15:13:25

LinuxVim源代碼
點贊
收藏

51CTO技術棧公眾號

国产乱码精品一区二区三区av | 美国三级日本三级久久99| 亚洲精品一区二区久| 韩国一区二区av| 永久av在线| 懂色av中文字幕一区二区三区| 午夜精品免费视频| 东京热无码av男人的天堂| 精品国产亚洲一区二区三区大结局 | 色婷婷久久久久swag精品| 亚洲精品日韩在线观看| 精品国产无码一区二区三区| 国产精品夜夜夜| 色偷偷888欧美精品久久久| 99riav国产精品视频| 88xx成人免费观看视频库 | 国产天堂av在线| 成人资源在线| 欧美日韩久久一区二区| 欧美精品久久久久久久自慰| 91高清在线视频| 成人久久视频在线观看| 国产欧美一区二区白浆黑人| 韩国av免费观看| 99久久婷婷这里只有精品| 精品调教chinesegay| 超碰人人cao| 91在线亚洲| 欧美日韩国产区| 日韩视频 中文字幕| www.成人.com| 久久久蜜臀国产一区二区| 99视频免费观看蜜桃视频| 伊人免费在线观看高清版| 国产亚洲在线观看| 欧美激情视频一区二区三区不卡| 正在播放国产对白害羞| 亚洲区小说区| 亚洲精品国产免费| 丰满人妻一区二区三区53视频| 日韩高清成人| 天天色天天爱天天射综合| 香蕉视频免费版| 日本精品在线| 国产精品久久久久久久久免费相片| 欧美日韩精品综合| 午夜视频免费看| 成人精品国产免费网站| 97久草视频| 国产美女精品视频国产| 久久激情五月婷婷| 国产精品久久久久久久久免费看| 国产又色又爽又黄的| 激情一区二区| 久久久久久亚洲精品不卡| 精品爆乳一区二区三区无码av| 最新精品国产| 蜜月aⅴ免费一区二区三区 | 亚洲色图视频网站| 夜夜爽www精品| 在线观看免费黄视频| 国产精品免费观看视频| 一本色道久久综合亚洲精品婷婷| youjizz在线播放| 中文字幕精品综合| 性欧美大战久久久久久久免费观看| 青青草娱乐在线| 久久欧美中文字幕| 日韩区国产区| 在线激情免费视频| 亚洲精品综合在线| 800av在线免费观看| 国产乱码在线| 精品欧美一区二区三区| 黑森林福利视频导航| 伊人久久高清| 欧美久久一二区| 黑人性生活视频| 成人看片爽爽爽| 亚洲男人天堂手机在线| 99久久99久久精品免费看小说.| 欧美偷拍自拍| 粗暴蹂躏中文一区二区三区| 国产一级二级毛片| 销魂美女一区二区三区视频在线| 国产999在线观看| 艳妇乳肉豪妇荡乳av| 国产美女精品在线| 国产日韩精品久久| 国产高清视频在线观看| 亚洲日本青草视频在线怡红院| 成人毛片100部免费看| 小草在线视频免费播放| 欧美美女一区二区三区| 欧美xxxx黑人| 久久av超碰| 久热精品视频在线| 国产毛片aaa| 精品一区二区三区在线播放视频| 成人免费视频观看视频| 福利成人在线观看| 亚洲专区一二三| 国产熟人av一二三区| 高清一区二区| 亚洲视频专区在线| 成人免费视频网站入口::| 国产一区成人| 亚洲自拍偷拍第一页| 黄色网址在线播放| 一区二区三区欧美日韩| 苍井空浴缸大战猛男120分钟| 豆花视频一区| 国产亚洲精品一区二区| 国产一级在线观看视频| 男女性色大片免费观看一区二区| 国产精品一区二区a| 一级日本在线| 欧美色另类天堂2015| 国产福利精品一区二区三区| 日韩精品免费一区二区三区竹菊| 日韩在线不卡视频| www毛片com| 成人av网址在线观看| 色中文字幕在线观看| 美女91在线看| 日韩女同互慰一区二区| 日韩福利在线视频| 亚洲一区二区网站| 国产经品一区二区| 日本中文字幕在线2020| 色网综合在线观看| 久久福利小视频| 欧美日韩免费观看一区=区三区| 国产成人精品一区二区三区| 国精产品乱码一区一区三区四区| 亚洲欧洲色图综合| 久热精品在线播放| 精品视频免费在线观看| 日产精品久久久一区二区福利 | 亚洲精品一区中文| 国产稀缺真实呦乱在线| 国产福利91精品| 一级黄色片播放| 91成人短视频在线观看| 中文欧美日本在线资源| 欧美日韩激情四射| 欧美爱爱视频| 中文字幕日韩精品在线观看| 国产一区二区视频免费| 久久综合久久综合久久综合| 九九爱精品视频| 丁香综合av| 欧美激情视频在线免费观看 欧美视频免费一 | 污视频在线观看免费网站| 成人影视亚洲图片在线| 国产成人精品久久二区二区91| 视频一区二区三区国产| 欧美日韩一区二区免费视频| 欧美熟妇精品黑人巨大一二三区| 日韩午夜电影| 久久av免费一区| 亚洲黄色免费av| 亚洲久久久久久久久久久| 国产伦精品一区二区三区视频网站| 91色视频在线| 97在线免费公开视频| 久草成人在线| 国产精品欧美在线| 免费成人黄色| 91精品国产色综合久久久蜜香臀| 国产大片免费看| 国产成人精品影院| 丰满爆乳一区二区三区| 国产一区二区三区电影在线观看| 国产精品福利网站| av电影在线观看一区二区三区| 欧美日韩一区久久| 手机在线免费看毛片| 成人福利视频在线看| 一本大道熟女人妻中文字幕在线| 狠狠操综合网| 91在线|亚洲| 国产白浆在线免费观看| 亚洲四色影视在线观看| 在线视频播放大全| 亚洲三级久久久| 亚洲熟女乱综合一区二区| 亚洲免费激情| 亚洲日本无吗高清不卡| 中文无码日韩欧| 国产97人人超碰caoprom| 黄色网页在线看| 亚洲精品国产福利| 一级视频在线播放| 性做久久久久久久久| 一级片视频免费看| 国产精品77777| 一本久道中文无码字幕av| 一区二区免费不卡在线| 欧美激情论坛| 国产午夜久久av| 国产999精品久久久| 羞羞视频在线观看不卡| 亚洲女人初尝黑人巨大| 99久久一区二区| 色哟哟精品一区| 久久久精品人妻一区二区三区四| 久久久亚洲精品石原莉奈| 国产伦精品一区二区三区妓女下载 | 最近中文字幕日韩精品 | 日本在线视频一区二区| 欧美精品久久久久久久免费观看 | 久久久久国产精品人| 亚洲精品无码久久久久久久| 首页国产欧美久久| 国产a级片网站| 91精品国产91久久久久久黑人| 久久久久高清| 韩国精品福利一区二区三区| 91久久久在线| 成人国产精品| 欧洲永久精品大片ww免费漫画| 怡红院红怡院欧美aⅴ怡春院| 亚洲人成毛片在线播放| 五月婷婷免费视频| 3atv在线一区二区三区| 欧美超碰在线观看| 精品国产31久久久久久| 久草视频手机在线观看| 亚洲色图欧美激情| 丁香六月激情综合| 久久精品一级爱片| 我和岳m愉情xxxⅹ视频| 成人白浆超碰人人人人| 在线观看你懂的视频| 黑人巨大精品欧美一区| 高清av免费看| 美日韩一区二区| 欧美性猛交xxx乱久交| 亚洲女同同性videoxma| www.av中文字幕| 亚洲大片在线| 免费特级黄色片| 国产在线日韩| 精品久久久无码人妻字幂| 你懂的国产精品永久在线| 91免费网站视频| 亚洲成av人片乱码色午夜| 一区二区三区四区五区视频| 欧洲杯什么时候开赛| 相泽南亚洲一区二区在线播放 | 欧洲美女和动交zoz0z| 国产精品videosex性欧美| 亚洲精品国产精品久久| 日本道不卡免费一区| 亚洲欧洲日韩精品| 第一会所亚洲原创| 亚洲亚洲精品三区日韩精品在线视频| 精品一级毛片| 一区二区不卡在线视频 午夜欧美不卡' | 久草在线视频网站| 欧美激情影音先锋| 国产理论在线| 欧美综合国产精品久久丁香| 日韩大片欧美大片| 国产精品流白浆视频| 日韩福利影视| 亚洲最大激情中文字幕| gogo人体一区| 女人一区二区三区| 日韩理论电影院| 特级西西444| 亚洲国产精品一区| 亚洲国产精品久久久久爰色欲| 日韩国产高清在线| 中文字幕第三区| 成人激情校园春色| 全黄一级裸体片| 一区在线中文字幕| 久久久久久久九九九九| 欧美日韩在线视频一区| 中文字幕av片| 日韩欧美国产电影| 三级视频在线播放| 日韩视频第一页| 24小时免费看片在线观看 | 欧美另类激情| 国产精成人品localhost| 国产午夜一区| 黄色三级中文字幕| 香蕉精品999视频一区二区| 潘金莲激情呻吟欲求不满视频| 国产成人免费在线观看| 受虐m奴xxx在线观看| 亚洲素人一区二区| 成人午夜视频在线播放| 欧美日韩一级黄| 亚洲欧美色视频| y97精品国产97久久久久久| 欧美6一10sex性hd| 国产精品视频xxx| 久久porn| 国产精品12p| 亚洲综合二区| 久久久久久无码精品人妻一区二区| 久久久久久久电影| 免费人成视频在线| 欧美丝袜丝交足nylons图片| 日本激情一区二区| 色噜噜国产精品视频一区二区 | 亚洲乱码免费伦视频| 欧美色图色综合| 国产高清在线观看免费不卡| 丁香激情五月少妇| 婷婷国产v国产偷v亚洲高清| 国产精品综合在线| 国产一区二区黑人欧美xxxx| av福利导福航大全在线| 91亚洲国产精品| 国产一区二区在线| 国产精品一区二区免费在线观看| 国产一区啦啦啦在线观看| 午夜精产品一区二区在线观看的| 亚洲国产精品久久久久秋霞影院| 91亚洲国产成人久久精品麻豆| 亚洲欧洲日产国产网站| 91九色porn在线资源| 91精品国产91久久久久青草| 久久综合av| 色多多视频在线播放| 久久亚洲一区二区三区明星换脸| 国产精品成人免费一区二区视频| 日韩一区二区三区av| 欧美成人二区| 国产在线播放不卡| av一区二区在线播放| 成年人在线看片| 国产亚洲欧美日韩日本| 国产婷婷色一区二区在线观看| 欧美一区二区播放| 成人黄视频在线观看| 91网在线免费观看| 五月激情久久久| 成人日韩在线视频| 国产精品乱人伦中文| 夜夜躁很很躁日日躁麻豆| 色午夜这里只有精品| 男人亚洲天堂| 日本免费在线视频观看| 国产在线乱码一区二区三区| 国产色无码精品视频国产| 91精品国模一区二区三区| 国产高清免费av在线| 手机在线免费看av| 国产在线999| 五月天久久久| 视频区 图片区 小说区| 亚洲丝袜另类动漫二区| 国产精品久久无码一三区| 久热精品视频在线| 中文字幕区一区二区三| 欧美国产日韩激情| 97久久超碰国产精品| www毛片com| 中文字幕亚洲欧美| 日韩三区四区| 91视频成人免费| 成人国产精品免费网站| 亚洲影院在线播放| 这里只有精品在线播放| 天堂久久一区| 日本男女交配视频| 91丝袜呻吟高潮美腿白嫩在线观看| 国产区一区二区三| 亚洲性线免费观看视频成熟| 国产伊人久久| www.男人天堂网| 久久综合色鬼综合色| 中文字幕视频二区| 欧美激情手机在线视频| 香蕉一区二区| 看看黄色一级片| 亚洲国产欧美日韩另类综合| 日本成人一区二区三区| 国产精品私拍pans大尺度在线| 欧美在线91| 中日韩精品一区二区三区| 欧美日韩日本视频| 国产偷倩在线播放| 日本精品一区二区三区高清 久久| 麻豆精品视频在线| 日韩精品视频播放| 日韩视频一区在线| 日韩激情啪啪| 女王人厕视频2ⅴk| 色噜噜夜夜夜综合网| 91精品国产91久久久久久青草| 久热这里只精品99re8久| 国内精品伊人久久久久av影院| 亚洲一区欧美在线|