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

在Node.js中看JavaScript的引用

開發(fā) 前端
早期學(xué)習(xí) Node.js 的時(shí)候 (2011-2012),有挺多是從 PHP 轉(zhuǎn)過來的,當(dāng)時(shí)有部分人對(duì)于 Node.js 編輯完代碼需要重啟一下表示麻煩(PHP不需要這個(gè)過程),于是社區(qū)里的朋友就開始提倡使用 node-supervisor 這個(gè)模塊來啟動(dòng)項(xiàng)目,可以編輯完代碼之后自動(dòng)重啟。

早期學(xué)習(xí) Node.js 的時(shí)候 (2011-2012),有挺多是從 PHP 轉(zhuǎn)過來的,當(dāng)時(shí)有部分人對(duì)于 Node.js 編輯完代碼需要重啟一下表示麻煩(PHP不需要這個(gè)過程),于是社區(qū)里的朋友就開始提倡使用 node-supervisor 這個(gè)模塊來啟動(dòng)項(xiàng)目,可以編輯完代碼之后自動(dòng)重啟。不過相對(duì)于 PHP 而言依舊不夠方便,因?yàn)?Node.js 在重啟以后,之前的上下文都丟失了。

雖然可以通過將 session 數(shù)據(jù)保存在數(shù)據(jù)庫或者緩存中來減少重啟過程中的數(shù)據(jù)丟失,不過如果是在生產(chǎn)的情況下,更新代碼的重啟間隙是沒法處理請求的(PHP可以,另外那個(gè)時(shí)候 Node.js 還沒有 cluster)。由于這方面的問題,加上本人是從 PHP 轉(zhuǎn)到 Node.js 的,于是從那時(shí)開始思考,有沒有辦法可以在不重啟的情況下熱更新 Node.js 的代碼。

[[187996]]

最開始把目光瞄向了 require 這個(gè)模塊。想法很簡單,因?yàn)?Node.js 中引入一個(gè)模塊都是通過 require 這個(gè)方法加載的。于是就開始思考 require 能不能在更新代碼之后再次 require 一下。嘗試如下:

a.js

var express = require('express');
var b = require('./b.js');

var app = express();

app.get('/', function (req, res) {
  b = require('./b.js');
  res.send(b.num);
});

app.listen(3000);

b.js

exports.num = 1024;

兩個(gè) JS 文件寫好之后,從 a.js 啟動(dòng),刷新頁面會(huì)輸出 b.js 中的 1024,然后修改 b.js 文件中導(dǎo)出的值,例如修改為 2048。再次刷新頁面依舊是原本的 1024。

再次執(zhí)行一次 require 并沒有刷新代碼。require 在執(zhí)行的過程中加載完代碼之后會(huì)把模塊導(dǎo)出的數(shù)據(jù)放在 require.cache 中。require.cache 是一個(gè) { } 對(duì)象,以模塊的絕對(duì)路徑為 key,該模塊的詳細(xì)數(shù)據(jù)為 value。于是便開始做如下嘗試:

a.js

var path = require('path');
var express = require('express');
var b = require('./b.js');

var app = express();

app.get('/', function (req, res) {
  if (true) { // 檢查文件是否修改
    flush();
  }
  res.send(b.num);
});

function flush() {
  delete require.cache[path.join(__dirname, './b.js')];
  b = require('./b.js');
}

app.listen(3000);

再次 require 之前,將 require 之上關(guān)于該模塊的 cache 清理掉后,用之前的方法再次測試。結(jié)果發(fā)現(xiàn),可以成功的刷新 b.js 的代碼,輸出新修改的值。

了解到這個(gè)點(diǎn)后,就想通過該原理實(shí)現(xiàn)一個(gè)無重啟熱更新版本的 node-supervisor。在封裝模塊的過程中,出于情懷的原因,考慮提供一個(gè)類似 PHP 中 include 的函數(shù)來代替 require 去引入一個(gè)模塊。實(shí)際內(nèi)部依舊是使用 require 去加載。以b.js為例,原本的寫法改為 var b = include(‘./b’),在文件 b.js 更新之后 include 內(nèi)部可以自動(dòng)刷新,讓外面拿到***的代碼。

但是實(shí)際的開發(fā)過程中,這樣很快就碰到了問題。我們希望的代碼可能是這樣:

web.js

var include = require('./include');
var express = require('express');
var b = include('./b.js');
var app = express();

app.get('/', function (req, res) {
  res.send(b.num);
});

app.listen(3000);

但按照這個(gè)目標(biāo)封裝include的時(shí)候,我們發(fā)現(xiàn)了問題。無論我們在include.js內(nèi)部中如何實(shí)現(xiàn),都不能像開始那樣拿到新的 b.num。

對(duì)比開始的代碼,我們發(fā)現(xiàn)問題出在少了 b = xx。也就是說這樣寫才可以:

web.js

var include = require('./include');
var express = require('express');
var app = express();

app.get('/', function (req, res) {
  var b = include('./b.js');
  res.send(b.num);
});

app.listen(3000);

修改成這樣,就可以保證每次能可以正確的刷新到***的代碼,并且不用重啟實(shí)例了。讀者有興趣的可以研究這個(gè)include是怎么實(shí)現(xiàn)的,本文就不深入討論了,因?yàn)檫@個(gè)技巧使用度不高,寫起起來不是很優(yōu)雅[1],反而這其中有一個(gè)更重要的問題——JavaScript的引用。

JavaScript 的引用與傳統(tǒng)引用的區(qū)別

要討論這個(gè)問題,我們首先要了解 JavaScript 的引用于其他語言中的一個(gè)區(qū)別,在 C++ 中引用可以直接修改外部的值:

#include <iostream>

using namespace std;

void test(int &p) // 引用傳遞 {
    p = 2048;
}

int main() {
    int a = 1024;
    int &p = a; // 設(shè)置引用p指向a

    test(p); // 調(diào)用函數(shù)

    cout << "p: " << p << endl; // 2048
    cout << "a: " << a << endl; // 2048
    return 0;
}

而在 JavaScript 中:

var obj = { name: 'Alan' };

function test1(obj) {
  obj = { hello: 'world' }; // 試圖修改外部obj
}

test1(obj);
console.log(obj); // { name: 'Alan' } // 并沒有修改①

function test2(obj) {
  obj.name = 'world'; // 根據(jù)該對(duì)象修改其上的屬性
}

test2(obj);
console.log(obj); // { name: 'world' } // 修改成功②

我們發(fā)現(xiàn)與 C++ 不同,根據(jù)上面代碼 ① 可知 JavaScript 中并沒有傳遞一個(gè)引用,而是拷貝了一個(gè)新的變量,即值傳遞。根據(jù) ② 可知拷貝的這個(gè)變量是一個(gè)可以訪問到對(duì)象屬性的“引用”(與傳統(tǒng)的 C++ 的引用不同,下文中提到的 JavaScript 的引用都是這種特別的引用)。這里需要總結(jié)一個(gè)繞口的結(jié)論:Javascript 中均是值傳遞,對(duì)象在傳遞的過程中是拷貝了一份新的引用。

為了理解這個(gè)比較拗口的結(jié)論,讓我們來看一段代碼:

var obj = {
  data: {}
};

// data 指向 obj.data
var data = obj.data;

console.log(data === obj.data); // true-->data所操作的就是obj.data

data.name = 'Alan';
data.test = function () {
  console.log('hi')
};

// 通過data可以直接修改到data的值
console.log(obj) // { data: { name: 'Alan', test: [Function] } }

data = {
  name: 'Bob',
  add: function (a, b) {
    return a + b;
  }
};

// data是一個(gè)引用,直接賦值給它,只是讓這個(gè)變量等于另外一個(gè)引用,并不會(huì)修改到obj本身
console.log(data); // { name: 'Bob', add: [Function] }
console.log(obj); // { data: { name: 'Alan', test: [Function] } }

obj.data = {
  name: 'Bob',
  add: function (a, b) {
    return a + b;
  }
};

// 而通過obj.data才能真正修改到data本身
console.log(obj); // { data: { name: 'Bob', add: [Function] } }

通過這個(gè)例子我們可以看到,data 雖然像一個(gè)引用一樣指向了 obj.data,并且通過 data 可以訪問到 obj.data 上的屬性。但是由于 JavaScript 值傳遞的特性直接修改 data = xxx 并不會(huì)使得 obj.data = xxx。

打個(gè)比方最初設(shè)置 var data = obj.data 的時(shí)候,內(nèi)存中的情況大概是:

|   Addr   |  內(nèi)容  | |----------|-------- | obj.data |  內(nèi)存1 |
|   data   |  內(nèi)存1 |

所以通過 data.xx 可以修改 obj.data 的內(nèi)存1。

然后設(shè)置 data = xxx,由于 data 是拷貝的一個(gè)新的值,只是這個(gè)值是一個(gè)引用(指向內(nèi)存1)罷了。讓它等于另外一個(gè)對(duì)象就好比:

|   Addr   |  內(nèi)容  | |----------|-------- | obj.data |  內(nèi)存1 |
|   data   |  內(nèi)存2 |

讓 data 指向了新的一塊內(nèi)存2。

如果是傳統(tǒng)的引用(如上文中提到的 C++ 的引用),那么 obj.data 本身會(huì)變成新的內(nèi)存2,但 JavaScript 中均是值傳遞,對(duì)象在傳遞的過程中拷貝了一份新的引用。所以這個(gè)新拷貝的變量被改變并不影響原本的對(duì)象。

Node.js 中的 module.exports 與 exports

上述例子中的 obj.data 與 data 的關(guān)系,就是 Node.js 中的 module.exports 與 exports 之間的關(guān)系。讓我們來看看 Node.js 中 require 一個(gè)文件時(shí)的實(shí)際結(jié)構(gòu):

function require(...) {
  var module = { exports: {} };
  ((module, exports) => { // Node.js 中文件外部其實(shí)被包了一層自執(zhí)行的函數(shù)
    // 這中間是你模塊內(nèi)部的代碼.
    function some_func() {};
    exports = some_func;
    // 這樣賦值,exports便不再指向module.exports
    // 而module.exports依舊是{}

    module.exports = some_func;
    // 這樣設(shè)置才能修改到原本的exports
  })(module, module.exports);
  return module.exports;
}

所以很自然的:

console.log(module.exports === exports); // true
// 所以 exports 所操作的就是 module.exports

Node.js 中的 exports 就是拷貝的一份 module.exports 的引用。通過 exports 可以修改Node.js 當(dāng)前文件導(dǎo)出的屬性,但是不能修改當(dāng)前模塊本身。通過 module.exports 才可以修改到其本身。表現(xiàn)上來說:

exports = 1; // 無效
module.exports = 1; // 有效

這是二者表現(xiàn)上的區(qū)別,其他方面用起來都沒有差別。所以你現(xiàn)在應(yīng)該知道寫module.exports.xx = xxx; 的人其實(shí)是多寫了一個(gè)module.。

更復(fù)雜的例子

為了再練習(xí)一下,我們在來看一個(gè)比較復(fù)雜的例子:

var a = {n: 1};  
var b = a; 
a.x = a = {n: 2};  
console.log(a.x);
console.log(b.x);

按照開始的結(jié)論我們可以一步步的來看這個(gè)問題:

var a = {n: 1};   // 引用a指向內(nèi)存1{n:1}
var b = a;        // 引用b => a => { n:1 }

內(nèi)部結(jié)構(gòu):

|   Addr  |     內(nèi)容     | |---------|-------------|
|    a    |  內(nèi)存1 {n:1} | |    b    |  內(nèi)存1       |

繼續(xù)往下看:

a.x = a = {n: 2};  //  (內(nèi)存1 而不是 a ).x = 引用 a = 內(nèi)存2 {n:2}

a 雖然是引用,但是 JavaScript 是值傳的這個(gè)引用,所以被修改不影響原本的地方。

|    Addr   |          內(nèi)容         | |-----------|-----------------------|
| 1) a	    |  內(nèi)存2({n:2})         | | 2) 內(nèi)存1.x |  內(nèi)存2({n:2})         |
| 3) b	    |  內(nèi)存1({n:1, x:內(nèi)存2}) |

所以***的結(jié)果

  • a.x 即(內(nèi)存2).x ==> {n: 2}.x ==> undefined
  • b.x 即(內(nèi)存1).x ==> 內(nèi)存2 ==> {n: 2}

總結(jié)

JavaScrip t中沒有引用傳遞,只有值傳遞。對(duì)象(引用類型)的傳遞只是拷貝一個(gè)新的引用,這個(gè)新的引用可以訪問原本對(duì)象上的屬性,但是這個(gè)新的引用本身是放在另外一個(gè)格子上的值,直接往這個(gè)格子賦新的值,并不會(huì)影響原本的對(duì)象。本文開頭所討論的 Node.js 熱更新時(shí)碰到的也是這個(gè)問題,區(qū)別是對(duì)象本身改變了,而原本拷貝出來的引用還指向舊的內(nèi)存,所以通過舊的引用調(diào)用不到新的方法。

Node.js 并沒有對(duì) JavaScript 施加黑魔法,其中的引用問題依舊是 JavaScript 的內(nèi)容。如 module.exports 與 exports 這樣隱藏了一些細(xì)節(jié)容易使人誤會(huì),本質(zhì)還是 JavaScript 的問題。另外推薦一個(gè)關(guān)于 Node.js 的進(jìn)階教程 《Node.js 面試》。

注[1]:

  1. 老實(shí)說,模塊在函數(shù)內(nèi)聲明有點(diǎn)譚浩強(qiáng)的感覺。
  2. 把 b = include(xxx) 寫在調(diào)用內(nèi)部,還可以通過設(shè)置成中間件綁定在公共地方來寫。
  3. 除了寫在調(diào)用內(nèi)部,也可以導(dǎo)出一個(gè)工廠函數(shù),每次使用時(shí) b().num 一下調(diào)用也可以。
  4. 還可以通過中間件的形式綁定在框架的公用對(duì)象上(如:ctx.b = include(xxx))。
  5. 要實(shí)現(xiàn)這樣的熱更新必須在架構(gòu)上就要嚴(yán)格避免舊代碼被引用的可能性,否則很容易寫出內(nèi)存泄漏的代碼。
責(zé)任編輯:張燕妮 來源: lellansin
相關(guān)推薦

2022-01-02 06:55:08

Node.js ObjectWrapAddon

2022-10-28 15:51:24

JavaScript開發(fā)Node.js

2014-03-07 13:43:32

Node.jsNode

2021-12-01 00:05:03

Js應(yīng)用Ebpf

2013-11-01 09:34:56

Node.js技術(shù)

2015-03-10 10:59:18

Node.js開發(fā)指南基礎(chǔ)介紹

2016-08-02 10:22:10

JS微軟Node

2021-12-25 22:29:57

Node.js 微任務(wù)處理事件循環(huán)

2020-05-29 15:33:28

Node.js框架JavaScript

2012-02-03 09:25:39

Node.js

2020-07-31 13:35:34

Node.js應(yīng)用分析前端

2011-11-01 10:30:36

Node.js

2011-09-08 13:46:14

node.js

2011-09-09 14:23:13

Node.js

2011-09-02 14:47:48

Node

2012-10-24 14:56:30

IBMdw

2011-11-10 08:55:00

Node.js

2014-02-14 10:48:32

Visual StudNode.js

2011-10-28 16:05:56

Node.js

2021-07-26 05:24:59

Node.js SO_RESUEPORLibuv
點(diǎn)贊
收藏

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

成人乱码手机视频| 国产午夜在线视频| 亚洲国产欧美国产综合一区| 精品国产污污免费网站入口 | 国产精品成人国产乱一区| 色欲AV无码精品一区二区久久 | 99精品在线直播| 日韩免费av片| 日本一区二区高清不卡| 在线视频你懂得一区二区三区| 精品久久免费观看| 欧美一级在线免费观看| 日本特黄久久久高潮| 九九九热精品免费视频观看网站| 美女又爽又黄视频毛茸茸| 国产一区高清| 黄色一区二区在线| 中文字幕日韩精品久久| 无码国产精品高潮久久99| 日韩经典中文字幕一区| 欧美美女操人视频| 亚洲国产av一区| 欧美国产亚洲精品| 欧美性生交大片免网| 欧美性受黑人性爽| 青青青草网站免费视频在线观看| 精品一区二区三区在线播放视频 | 精品国产二区在线| 超碰在线免费97| 亚洲午夜伦理| 北条麻妃99精品青青久久| 国产又黄又粗又猛又爽的视频| 成人国产激情在线| 天天亚洲美女在线视频| 久久综合资源网| 久久精品一本久久99精品| 国产 中文 字幕 日韩 在线| 精品久久久久久久久久岛国gif| 欧美午夜片欧美片在线观看| 成人免费观看在线| 免费观看在线午夜影视| 久久久久久免费网| 国产精品久久久久久久久婷婷| 国产精品久久久久久久久毛片| 美女黄色成人网| 国内自拍欧美激情| 精品国产乱码久久久久久鸭王1| 亚洲欧美校园春色| 精品va天堂亚洲国产| 人妻少妇偷人精品久久久任期| 99久久精品一区二区成人| 福利二区91精品bt7086| 国产精品国产三级国产专区51| 麻豆网在线观看| 久久嫩草精品久久久精品| 国产伦一区二区三区色一情| 亚洲va欧美va| 国产电影精品久久禁18| 91啪国产在线| 国产精品人人妻人人爽| 久久99精品久久久| 国产精品色视频| 一区二区视频免费| 国产一区二区精品| 欧美性受xxx| 欧美一级特黄视频| 久久福利一区| 国产成人精品久久二区二区91| 国产欧美一区二区三区在线看蜜臂| 亚洲午夜在线| 欧美激情一级欧美精品| 久久精品美女视频| 好看的av在线不卡观看| 操日韩av在线电影| 日韩在线视频网址| 欧美精品观看| 久久久免费电影| 日本三级一区二区| 99在线精品视频在线观看| 97精品国产91久久久久久| 亚洲一二三在线观看| 99精品视频在线| 久久福利视频网| 久久免费视频精品| 99热免费精品| 国产精品国模在线| 91成人在线免费| 日本不卡在线视频| 成人精品一区二区三区电影黑人| 国产日韩欧美中文字幕| 成av人片一区二区| 日韩精品第一页| aa在线视频| 都市激情亚洲色图| 色婷婷综合网站| 97超碰成人| 日韩精品在线视频| 99成人在线观看| 国模大胆一区二区三区| 久久免费少妇高潮久久精品99| 黄色在线视频网址| 国产一区二区三区蝌蚪| 国产一区二区三区四区五区加勒比| 色哟哟中文字幕| 国产精品―色哟哟| 久激情内射婷内射蜜桃| 91精品韩国| 日韩精品专区在线影院观看 | 成人黄色动漫| 欧洲亚洲国产日韩| 亚洲AV成人精品| 国产不卡av一区二区| 超碰97人人做人人爱少妇| 日本一级一片免费视频| 久久66热偷产精品| 久久99精品久久久久久久青青日本 | 老鸭窝亚洲一区二区三区| 国产热re99久久6国产精品| 欧美一级视频免费| 亚洲国产精品99久久久久久久久 | 一级国产黄色片| 888久久久| 国产成人av网| 色屁屁草草影院ccyycom| 国产精品水嫩水嫩| 成人在线观看你懂的| 9999在线精品视频| 亚洲精品网站在线播放gif| 久久国产在线视频| 免费xxxx性欧美18vr| 精品人伦一区二区三区| 色婷婷av在线| 欧美麻豆精品久久久久久| 五月婷婷综合在线观看| 国内揄拍国内精品久久| 国产精品久久久久久久久久99| 欧美综合视频在线| 亚洲精品视频在线| 在线观看免费av网址| 红桃视频在线观看一区二区| 97在线观看视频| 亚洲精华国产精华精华液网站| 2022国产精品视频| 日本中文字幕亚洲| 亚洲精品三区| 中文字幕亚洲综合久久| 欧美日韩 一区二区三区| 91麻豆国产福利在线观看| 五月丁香综合缴情六月小说| 成人性片免费| 亚洲香蕉av在线一区二区三区| 97久久久久久久| 99久久婷婷国产综合精品| 欧美大黑帍在线播放| 欧美电影在线观看一区| 成人97在线观看视频| 91成人在线免费| 中文字幕亚洲成人| 中文字幕资源在线观看| 色婷婷色综合| 国产精品一区二区性色av| 成人精品一区| 欧美日韩一区视频| 后入内射无码人妻一区| 激情久久五月天| 美女黄色片网站| 亚洲综合网站| 久久欧美在线电影| 天天摸夜夜添狠狠添婷婷| 亚洲永久精品国产| 成人欧美精品一区二区| 99精品免费视频| 欧美 日韩 国产在线| 韩日精品一区二区| 国产午夜精品视频| 艳妇乳肉豪妇荡乳av| 国产日韩三级在线| 中文字幕在线综合| 综合天堂av久久久久久久| 97netav| 嗯啊主人调教在线播放视频| 亚洲精品资源美女情侣酒店| 中文永久免费观看| 国产精品盗摄一区二区三区| 永久免费看片在线观看| 韩国亚洲精品| 欧美自拍资源在线| 欧美大陆国产| 久久久在线视频| 欧美人体大胆444www| 欧美日韩日本视频| 国产亚洲精品av| 久久久久久久久久久久久久久99 | 四虎永久免费在线| 91色porny| 香蕉视频在线观看黄| 日韩av网站在线观看| 妺妺窝人体色www看人体| 不卡一区综合视频| 加勒比在线一区二区三区观看| 亚洲免费一区| 国产精品96久久久久久| 91色在线看| 久久精品国产一区二区电影| 深夜福利免费在线观看| 日韩欧美中文字幕一区| 国产精品无码粉嫩小泬| 欧美日韩国产丝袜美女| 欧美成人综合色| 国产精品成人免费在线| 中文字幕 亚洲一区| 国产成人免费视频精品含羞草妖精| 久久久精品麻豆| 亚洲一区日韩| 97中文字幕在线| 国产精品久久占久久| 日韩精品一区二区三区色偷偷| 欧美freesex8一10精品| 亚洲专区国产精品| 免费成人黄色网| 国产精品va在线播放| 九色porny丨国产首页在线| 欧美大尺度在线观看| 老司机99精品99| 精品国产一区二区在线| а天堂8中文最新版在线官网| 亚洲欧美www| 性xxxx搡xxxxx搡欧美| 精品国产a毛片| 亚洲第一色视频| 欧美大片拔萝卜| av免费在线不卡| 91精品国产一区二区三区| 一区二区三区黄色片| 欧美日韩视频在线一区二区 | 精品日本一线二线三线不卡| 国产精品久久久久久免费| 欧美精品粉嫩高潮一区二区| 亚洲视频中文字幕在线观看| 欧美性xxxxxx少妇| 天天干天天操天天操| 日本大香伊一区二区三区| 99精品在线播放| 色欧美88888久久久久久影院| 日本熟女毛茸茸| 在线视频欧美区| 亚洲视频久久久| 欧美一级欧美三级在线观看| 国产视频在线观看免费| 日韩欧美国产系列| 秋霞av鲁丝片一区二区| 日韩国产激情在线| 欧美孕妇孕交| 伊人亚洲福利一区二区三区| 免费观看在线午夜影视| 久久6精品影院| 91九色在线播放| 国产91在线播放精品91| 国产91精品在线| 3d动漫啪啪精品一区二区免费| 亚洲精品aⅴ| 久久久久久99| 国产欧美日韩一区二区三区四区| 亚洲一区二区三区精品在线观看| 91超碰国产精品| 国产美女永久无遮挡| 亚洲欧美日韩国产| 能看的毛片网站| 国产一区二区福利视频| 成人区人妻精品一区二| 久久美女艺术照精彩视频福利播放| 少妇视频在线播放| 一区二区三区不卡在线观看 | 人人精品人人爱| 深夜福利网站在线观看| av高清不卡在线| 天天操天天干天天操天天干| 亚洲精品免费在线| www.国产高清| 7777精品伊人久久久大香线蕉 | 久久婷婷国产91天堂综合精品| 精品一区二区三区蜜桃| 亚洲一级Av无码毛片久久精品| 国产三级欧美三级| 玖玖爱免费视频| 欧美影院一区二区| 亚洲美女性生活| 中文字幕久久久av一区| 国产美女情趣调教h一区二区| 国产成人精品999| 91免费精品国偷自产在线在线| 欧美日韩综合精品| 国产精品videossex久久发布| 日日碰狠狠躁久久躁婷婷| 国产精品99久久久久久有的能看 | 亚洲一级片av| 91在线码无精品| 欧美三级黄色大片| 色综合亚洲欧洲| 亚洲免费不卡视频| 中文字幕在线日韩| 亚洲伊人av| 99久久精品无码一区二区毛片 | 国产精品丝袜白浆摸在线| 国产成人福利av| 亚洲一区二区精品在线| 亚洲欧美网站| 9.1在线观看免费| 亚洲图片你懂的| 一本大道伊人av久久综合| 日韩激情视频在线播放| 日本不卡影院| 亚洲一区二区三区香蕉| 欧美日韩中文字幕一区二区三区| 国模无码视频一区二区三区| 丁香激情综合五月| 波多野结衣家庭教师| 欧美综合色免费| 欧美欧美欧美| 456国产精品| 奇米影视777在线欧美电影观看 | 精品美女在线观看| 免费a级在线播放| 国产欧美一区二区三区在线看| 中文有码一区| 日韩中文字幕三区| www.日韩精品| 亚洲视频免费播放| 亚洲国产欧美一区二区丝袜黑人 | 玖玖视频精品| 亚洲第一页av| 精品久久久久久久久中文字幕| 六月丁香色婷婷| 欧美黑人国产人伦爽爽爽| 亚洲一二av| 国产 日韩 亚洲 欧美| 成人av资源在线| 日本少妇性生活| 日韩电影中文字幕在线观看| 女人让男人操自己视频在线观看 | 欧美zozo| 国产精品jizz在线观看麻豆| 国产影视一区| 日韩中文字幕a| 亚洲欧美激情插| 亚洲av无码国产精品永久一区| 欧美极度另类性三渗透| 国产精品chinese在线观看| 91精品国产91久久久久麻豆 主演| 国产99久久久国产精品潘金网站| 欧美日韩国产精品一区二区三区| 精品日韩99亚洲| 亚洲精品日产| 日韩国产高清一区| 久久精品99国产精品日本| 日本在线一级片| 精品国内二区三区| 欧美在线极品| 亚洲国产成人不卡| 国产精品综合视频| 国产精品.www| 亚洲天堂男人的天堂| 亚洲欧洲日韩精品在线| 欧美一级中文字幕| 99久久伊人久久99| 五月婷婷激情五月| 久久久国产精品x99av | 亚洲a∨一区二区三区| 国产一区二区三区观看| 日韩成人免费在线观看| 亚洲欧洲在线免费| 91丨精品丨国产| 国产精品999视频| 中文字幕精品—区二区四季| 国产丰满美女做爰| 欧美在线不卡区| 亚洲精品一二三区区别| 538国产视频| 在线电影院国产精品| 波多野结衣视频一区二区| 日韩免费中文专区| 国产69精品久久99不卡| 五月婷婷激情视频| 久久艳片www.17c.com| 日韩人体视频| 欧美一级免费在线| 色偷偷久久一区二区三区| 午夜羞羞小视频在线观看| 欧美人与性禽动交精品| 国产高清久久久久| 波多野结衣日韩| 91国产精品电影| 亚洲成av人电影| 一色道久久88加勒比一| 日韩欧美一级特黄在线播放| 台湾佬成人网| 玩弄中年熟妇正在播放| 亚洲免费在线看| av在线二区| 精品亚洲欧美日韩|