成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

require是es6語法嗎

不是,require是CommonJS規范的模塊化語法;而es6規范的模塊化語法是import。require是運行時加載,import是編譯時加載;require可以寫在代碼的任意位置,import只能寫在文件的最頂端且不可在條件語句或函數作用域中使用;require運行時才引入模塊的屬性所以性能相對較低,import編譯時引入模塊的屬性所所以性能稍高。

require是es6語法嗎

前端(vue)入門到精通課程:進入學習
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調試工具:點擊使用

本教程操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

require是CommonJS規范的模塊化語法;而es6規范的模塊化語法是import。

CommonJS介紹

CommonJS實現了Javascript的模塊化規范,規范了模塊的特性和各模塊之間的相互依賴性,使得代碼可以更好的編寫和維護,同時提高了代碼的復用性。定義每個文件都是一個模塊(module變量代表當前模塊)并有自己的作用域,而每個文件里面定義的變量、函數、類,都是私有的,對于其他模塊是不可見。模塊的exports屬性是對外的接口,只有通過exports導出的屬性才能被加載識別。Node就是基于CommonJs規范實現的,因為CommonJS規范加載模塊是同步的,而服務器中的Node模塊都直接存儲在服務器本地硬盤中的,加載起來自然比較快,可以說node項目是CommonJs規范目前的最好實踐應用。

ECMAScript 6 (簡稱ES6)

ECMAScript是(European Computer Manufacturers Association Script)的縮寫,它是由ECMA國際標準化定制的一項JavaScript腳本語言的標準化規范。ECMAScript 6 是ECMA在2015年發布的JavaScript 的規范標準,解決 ES5 的很多先天不足并引入了模塊化思想。ES6模塊的設計思想是盡量的靜態化,使得編譯時就能確定模塊的依賴關系以及輸入和輸出的變量。

require與import的區別

1,require是運行時加載,import是編譯時加載;

2,require可以寫在代碼的任意位置,import只能寫在文件的最頂端且不可在條件語句或函數作用域中使用;

3,require通過module.exports導出的值就不能再變化,import通過export導出的值可以改變;

4;require通過module.exports導出的是exports對象,import通過export導出是指定輸出的代碼;

5,require運行時才引入模塊的屬性所以性能相對較低,import編譯時引入模塊的屬性所所以性能稍高。

javascript中的require、import與export

理想情況下,開發者只需要實現核心的業務邏輯,其他都可以加載別人已經寫好的模塊。

但是,Javascript不是一種模塊化編程語言,在es6以前,它是不支持”類”(class),所以也就沒有”模塊”(module)了。

require時代

Javascript社區做了很多努力,在現有的運行環境中,實現”模塊”的效果。

原始寫法

模塊就是實現特定功能的一組方法。
只要把不同的函數(以及記錄狀態的變量)簡單地放在一起,就算是一個模塊。

function m1(){  //... } function m2(){  //...   }
登錄后復制

上面的函數m1()m2() ,組成一個模塊。使用的時候,直接調用就行了。

這種做法的缺點很明顯:”污染”了全局變量,無法保證不與其他模塊發生變量名沖突,而且模塊成員之間看不出直接關系。

對象寫法

為了解決上面的缺點,可以把模塊寫成一個對象,所有的模塊成員都放到這個對象里面

var module1 = new Object({ _count : 0,  m1 : function (){   //...  },  m2 : function (){   //...  } });
登錄后復制

上面的函數m1()m2() ,都封裝在module1對象里。使用的時候,就是調用這個對象的屬性

module1.m1();
登錄后復制

這樣的寫法會暴露所有模塊成員,內部狀態可以被外部改寫。比如,外部代碼可以直接改變內部計數器的值。

module._count = 1;
登錄后復制

立即執行函數寫法

使用”立即執行函數”(Immediately-Invoked Function Expression,IIFE),可以達到不暴露私有成員的目的

var module = (function() { var _count = 0; var m1 = function() { alert(_count) } var m2 = function() { alert(_count + 1) }   return { m1: m1, m2: m2 } })()
登錄后復制

使用上面的寫法,外部代碼無法讀取內部的_count變量。

  console.info(module._count); //undefined
登錄后復制

module就是Javascript模塊的基本寫法。

主流模塊規范

在es6以前,還沒有提出一套官方的規范,從社區和框架推廣程度而言,目前通行的javascript模塊規范有兩種:CommonJS 和 AMD

CommonJS規范

require是es6語法嗎

2009年,美國程序員Ryan Dahl創造了node.js項目,將javascript語言用于服務器端編程。

這標志”Javascript模塊化編程”正式誕生。前端的復雜程度有限,沒有模塊也是可以的,但是在服務器端,一定要有模塊,與操作系統和其他應用程序互動,否則根本沒法編程。

node編程中最重要的思想之一就是模塊,而正是這個思想,讓JavaScript的大規模工程成為可能。模塊化編程在js界流行,也是基于此,隨后在瀏覽器端,requirejs和seajs之類的工具包也出現了,可以說在對應規范下,require統治了ES6之前的所有模塊化編程,即使現在,在ES6 module被完全實現之前,還是這樣。

在CommonJS中,暴露模塊使用module.exports和exports,很多人不明白暴露對象為什么會有兩個,后面會介紹區別

在CommonJS中,有一個全局性方法require() ,用于加載模塊。假定有一個數學模塊math.js,就可以像下面這樣加載。

var math = require('math');
登錄后復制

然后,就可以調用模塊提供的方法:

 var math = require('math');  math.add(2,3); // 5
登錄后復制

正是由于CommonJS 使用的require方式的推動,才有了后面的AMD、CMD 也采用的require方式來引用模塊的風格

AMD規范

require是es6語法嗎

有了服務器端模塊以后,很自然地,大家就想要客戶端模塊。而且最好兩者能夠兼容,一個模塊不用修改,在服務器和瀏覽器都可以運行。

但是,由于一個重大的局限,使得CommonJS規范不適用于瀏覽器環境。還是上一節的代碼,如果在瀏覽器中運行,會有一個很大的問題

var math = require('math'); math.add(2, 3);
登錄后復制

第二行math.add(2, 3) ,在第一行require(‘math')之后運行,因此必須等math.js加載完成。也就是說,如果加載時間很長,整個應用就會停在那里等。

這對服務器端不是一個問題,因為所有的模塊都存放在本地硬盤,可以同步加載完成,等待時間就是硬盤的讀取時間。但是,對于瀏覽器,這卻是一個大問題,因為模塊都放在服務器端,等待時間取決于網速的快慢,可能要等很長時間,瀏覽器處于”假死”狀態。

因此,瀏覽器端的模塊,不能采用”同步加載”(synchronous),只能采用”異步加載”(asynchronous)。這就是AMD規范誕生的背景。

AMD是”Asynchronous Module Definition”的縮寫,意思就是”異步模塊定義”。它采用異步方式加載模塊,模塊的加載不影響它后面語句的運行。所有依賴這個模塊的語句,都定義在一個回調函數中,等到加載完成之后,這個回調函數才會運行。

模塊必須采用特定的define()函數來定義。

define(id?, dependencies?, factory)
登錄后復制

登錄后復制

  • id:字符串,模塊名稱(可選)
  • dependencies: 是我們要載入的依賴模塊(可選),使用相對路徑。,注意是數組格式
  • factory: 工廠方法,返回一個模塊函數

如果一個模塊不依賴其他模塊,那么可以直接定義在define()函數之中。

// math.js   define(function (){     var add = function (x,y){       return x+y;     };     return {       add: add     };   });
登錄后復制

如果這個模塊還依賴其他模塊,那么define()函數的第一個參數,必須是一個數組,指明該模塊的依賴性。

define(['Lib'], function(Lib){     function foo(){       Lib.doSomething();     }     return {       foo : foo     };   });
登錄后復制

require()函數加載上面這個模塊的時候,就會先加載Lib.js文件。

AMD也采用require()語句加載模塊,但是不同于CommonJS,它要求兩個參數:

require([module], callback);
登錄后復制

第一個參數[module],是一個數組,里面的成員就是要加載的模塊;第二個參數callback,則是加載成功之后的回調函數。如果將前面的代碼改寫成AMD形式,就是下面這樣:

require(['math'], function (math) {  math.add(2, 3); });
登錄后復制

math.add()與math模塊加載不是同步的,瀏覽器不會發生假死。所以很顯然,AMD比較適合瀏覽器環境。

目前,主要有兩個Javascript庫實現了AMD規范:require.js和curl.js。

CMD規范

require是es6語法嗎

CMD (Common Module Definition), 是seajs推崇的規范,CMD則是依賴就近,用的時候再require。它寫起來是這樣的:

define(function(require, exports, module) { var clock = require('clock'); clock.start(); });
登錄后復制

CMD與AMD一樣,也是采用特定的define()函數來定義,用require方式來引用模塊

define(id?, dependencies?, factory)
登錄后復制

登錄后復制

  • id:字符串,模塊名稱(可選)
  • dependencies: 是我們要載入的依賴模塊(可選),使用相對路徑。,注意是數組格式
  • factory: 工廠方法,返回一個模塊函數

define('hello', ['jquery'], function(require, exports, module) {   // 模塊代碼   });
登錄后復制

如果一個模塊不依賴其他模塊,那么可以直接定義在define()函數之中。

define(function(require, exports, module) { // 模塊代碼 });
登錄后復制

注意:帶 id 和 dependencies 參數的 define 用法不屬于 CMD 規范,而屬于 Modules/Transport 規范。

CMD與AMD區別

AMD和CMD最大的區別是對依賴模塊的執行時機處理不同,而不是加載的時機或者方式不同,二者皆為異步加載模塊。

AMD依賴前置,js可以方便知道依賴模塊是誰,立即加載;

而CMD就近依賴,需要使用把模塊變為字符串解析一遍才知道依賴了那些模塊,這也是很多人詬病CMD的一點,犧牲性能來帶來開發的便利性,實際上解析模塊用的時間短到可以忽略。

現階段的標準

require是es6語法嗎

ES6標準發布后,module成為標準,標準使用是以export指令導出接口,以import引入模塊,但是在我們一貫的node模塊中,我們依然采用的是CommonJS規范,使用require引入模塊,使用module.exports導出接口。

export導出模塊

export語法聲明用于導出函數、對象、指定文件(或模塊)的原始值。

注意:在node中使用的是exports,不要混淆了

export有兩種模塊導出方式:命名式導出(名稱導出)和默認導出(定義式導出),命名式導出每個模塊可以多個,而默認導出每個模塊僅一個。

export { name1, name2, …, nameN }; export { variable1 as name1, variable2 as name2, …, nameN }; export let name1, name2, …, nameN; // also var export let name1 = …, name2 = …, …, nameN; // also var, const   export default expression; export default function (…) { … } // also class, function* export default function name1(…) { … } // also class, function* export { name1 as default, … };   export * from …; export { name1, name2, …, nameN } from …; export { import1 as name1, import2 as name2, …, nameN } from …;
登錄后復制

  • name1… nameN-導出的“標識符”。導出后,可以通過這個“標識符”在另一個模塊中使用import引用
  • default-設置模塊的默認導出。設置后import不通過“標識符”而直接引用默認導入
  • -繼承模塊并導出繼承模塊所有的方法和屬性
  • as-重命名導出“標識符”
  • from-從已經存在的模塊、腳本文件…導出

命名式導出

模塊可以通過export前綴關鍵詞聲明導出對象,導出對象可以是多個。這些導出對象用名稱進行區分,稱之為命名式導出。

export { myFunction }; // 導出一個已定義的函數 export const foo = Math.sqrt(2); // 導出一個常量
登錄后復制

我們可以使用*和from關鍵字來實現的模塊的繼承:

export * from 'article';
登錄后復制

模塊導出時,可以指定模塊的導出成員。導出成員可以認為是類中的公有對象,而非導出成員可以認為是類中的私有對象:

var name = 'IT筆錄'; var domain = 'http://itbilu.com';   export {name, domain}; // 相當于導出 {name:name,domain:domain}
登錄后復制

模塊導出時,我們可以使用as關鍵字對導出成員進行重命名:

var name = 'IT筆錄'; var domain = 'http://itbilu.com';   export {name as siteName, domain};
登錄后復制

注意:下面的語法有嚴重錯誤的情況:

// 錯誤演示 export 1; // 絕對不可以   var a = 100; export a;
登錄后復制

export在導出接口的時候,必須與模塊內部的變量具有一一對應的關系。直接導出1沒有任何意義,也不可能在import的時候有一個變量與之對應

export a雖然看上去成立,但是a的值是一個數字,根本無法完成解構,因此必須寫成export {a}的形式。即使a被賦值為一個function,也是不允許的。而且,大部分風格都建議,模塊中最好在末尾用一個export導出所有的接口,例如:

export {fun as default,a,b,c};
登錄后復制

默認導出

默認導出也被稱做定義式導出。命名式導出可以導出多個值,但在在import引用時,也要使用相同的名稱來引用相應的值。而默認導出每個導出只有一個單一值,這個輸出可以是一個函數、類或其它類型的值,這樣在模塊import導入時也會很容易引用。

export default function() {}; // 可以導出一個函數 export default class(){}; // 也可以出一個類
登錄后復制

命名式導出與默認導出

默認導出可以理解為另一種形式的命名導出,默認導出可以認為是使用了default名稱的命名導出。

下面兩種導出方式是等價的:

const D = 123;   export default D; export { D as default };
登錄后復制

export使用示例

使用名稱導出一個模塊時:

// "my-module.js" 模塊 export function cube(x) { return x * x * x; } const foo = Math.PI + Math.SQRT2; export { foo };
登錄后復制

在另一個模塊(腳本文件)中,我們可以像下面這樣引用:

import { cube, foo } from 'my-module'; console.log(cube(3)); // 27 console.log(foo); // 4.555806215962888
登錄后復制

使用默認導出一個模塊時:

// "my-module.js"模塊 export default function (x) { return x * x * x; }
登錄后復制

在另一個模塊(腳本文件)中,我們可以像下面這樣引用,相對名稱導出來說使用更為簡單:

// 引用 "my-module.js"模塊 import cube from 'my-module'; console.log(cube(3)); // 27
登錄后復制

import引入模塊

import語法聲明用于從已導出的模塊、腳本中導入函數、對象、指定文件(或模塊)的原始值。

import模塊導入與export模塊導出功能相對應,也存在兩種模塊導入方式:命名式導入(名稱導入)和默認導入(定義式導入)。

import的語法跟require不同,而且import必須放在文件的最開始,且前面不允許有其他邏輯代碼,這和其他所有編程語言風格一致。

import defaultMember from "module-name"; import * as name from "module-name"; import { member } from "module-name"; import { member as alias } from "module-name"; import { member1 , member2 } from "module-name"; import { member1 , member2 as alias2 , [...] } from "module-name"; import defaultMember, { member [ , [...] ] } from "module-name"; import defaultMember, * as name from "module-name"; import "module-name";
登錄后復制

  • name-從將要導入模塊中收到的導出值的名稱
  • member, memberN-從導出模塊,導入指定名稱的多個成員
  • defaultMember-從導出模塊,導入默認導出成員
  • alias, aliasN-別名,對指定導入成員進行的重命名
  • module-name-要導入的模塊。是一個文件名
  • as-重命名導入成員名稱(“標識符”)
  • from-從已經存在的模塊、腳本文件等導入

命名式導入

我們可以通過指定名稱,就是將這些成員插入到當作用域中。導出時,可以導入單個成員或多個成員:

注意:花括號里面的變量與export后面的變量一一對應

import {myMember} from "my-module"; import {foo, bar} from "my-module";
登錄后復制

通過*符號,我們可以導入模塊中的全部屬性和方法。當導入模塊全部導出內容時,就是將導出模塊('my-module.js')所有的導出綁定內容,插入到當前模塊('myModule')的作用域中:

import * as myModule from "my-module";
登錄后復制

導入模塊對象時,也可以使用as對導入成員重命名,以方便在當前模塊內使用:

import {reallyReallyLongModuleMemberName as shortName} from "my-module";
登錄后復制

導入多個成員時,同樣可以使用別名:

import {reallyReallyLongModuleMemberName as shortName, anotherLongModuleName as short} from "my-module";
登錄后復制

導入一個模塊,但不進行任何綁定:

import "my-module";
登錄后復制

默認導入

在模塊導出時,可能會存在默認導出。同樣的,在導入時可以使用import指令導出這些默認值。

直接導入默認值:

import myDefault from "my-module";
登錄后復制

也可以在命名空間導入和名稱導入中,同時使用默認導入:

import myDefault, * as myModule from "my-module"; // myModule 做為命名空間使用
登錄后復制

import myDefault, {foo, bar} from "my-module"; // 指定成員導入
登錄后復制

import使用示例

// --file.js-- function getJSON(url, callback) { let xhr = new XMLHttpRequest(); xhr.onload = function () { callback(this.responseText) }; xhr.open("GET", url, true); xhr.send(); }   export function getUsefulContents(url, callback) { getJSON(url, data => callback(JSON.parse(data))); }   // --main.js-- import { getUsefulContents } from "file"; getUsefulContents("http://itbilu.com", data => { doSomethingUseful(data); });
登錄后復制

default關鍵字

// d.js export default function() {}   // 等效于: function a() {}; export {a as default};
登錄后復制

在import的時候,可以這樣用:

import a from './d';   // 等效于,或者說就是下面這種寫法的簡寫,是同一個意思 import {default as a} from './d';
登錄后復制

這個語法糖的好處就是import的時候,可以省去花括號{}。

簡單的說,如果import的時候,你發現某個變量沒有花括號括起來(沒有*號),那么你在腦海中應該把它還原成有花括號的as語法。

所以,下面這種寫法你也應該理解了吧:

import $,{each,map} from 'jquery';
登錄后復制

import后面第一個$是{defalut as $}的替代寫法。

as關鍵字

as簡單的說就是取一個別名,export中可以用,import中其實可以用:

// a.js var a = function() {}; export {a as fun};   // b.js import {fun as a} from './a'; a();
登錄后復制

上面這段代碼,export的時候,對外提供的接口是fun,它是a.js內部a這個函數的別名,但是在模塊外面,認不到a,只能認到fun。

import中的as就很簡單,就是你在使用模塊里面的方法的時候,給這個方法取一個別名,好在當前的文件里面使用。之所以是這樣,是因為有的時候不同的兩個模塊可能通過相同的接口,比如有一個c.js也通過了fun這個接口:

// c.js export function fun() {};
登錄后復制

如果在b.js中同時使用a和c這兩個模塊,就必須想辦法解決接口重名的問題,as就解決了。

CommonJS中module.exports 與 exports的區別

Module.exports

The module.exports object is created by the Module system. Sometimes this is not acceptable; many want their module to be an instance of some class. To do this, assign the desired export object to module.exports. Note that assigning the desired object to exports will simply rebind the local exports variable, which is probably not what you want to do.

譯文:module.exports對象是由模塊系統創建的。 有時這是難以接受的;許多人希望他們的模塊成為某個類的實例。 為了實現這個,需要將期望導出的對象賦值給module.exports。 注意,將期望的對象賦值給exports會簡單地重新綁定到本地exports變量上,這可能不是你想要的。

Module.exports

The exports variable is available within a module's file-level scope, and is assigned the value of module.exports before the module is evaluated. It allows a shortcut, so that module.exports.f = … can be written more succinctly as exports.f = …. However, be aware that like any variable, if a new value is assigned to exports, it is no longer bound to module.exports:

譯文:exports變量是在模塊的文件級別作用域內有效的,它在模塊被執行前被賦于 module.exports 的值。它有一個快捷方式,以便 module.exports.f = … 可以被更簡潔地寫成exports.f = … 。 注意,就像任何變量,如果一個新的值被賦值給exports,它就不再綁定到module.exports(其實是exports.屬性會自動掛載到沒有命名沖突的module.exports.屬性)

從Api文檔上面的可以看出,從require導入方式去理解,關鍵有兩個變量(全局變量module.exports,局部變量exports)、一個返回值(module.exports)

function require(...) { var module = { exports: {} }; ((module, exports) => { // 你的被引入代碼 Start // var exports = module.exports = {}; (默認都有的) function some_func() {}; exports = some_func; // 此時,exports不再掛載到module.exports, // export將導出{}默認對象 module.exports = some_func; // 此時,這個模塊將導出some_func對象,覆蓋exports上的some_func // 你的被引入代碼 End })(module, module.exports); // 不管是exports還是module.exports,最后返回的還是module.exports return module.exports; }
登錄后復制

demo.js:

console.log(exports); // {} console.log(module.exports); // {} console.log(exports === module.exports); // true console.log(exports == module.exports); // true console.log(module); /** Module { id: '.', exports: {}, parent: null, filename: '/Users/larben/Desktop/demo.js', loaded: false, children: [], paths: [ '/Users/larben/Desktop/node_modules', '/Users/larben/node_modules', '/Users/node_modules', '/node_modules' ] } */
登錄后復制

注意

每個js文件一創建,都有一個var exports = module.exports = {} , 使exports和module.exports都指向一個空對象。

module.exports和exports所指向的內存地址相同

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
免费少妇A级毛片人成网| BBOX撕裂BASS后门在线| 亚洲人成伊人成综合网久久久| 亚洲AV无码日韩AⅤ无码忘忧草| 亚洲AⅤ无码日韩AV无码网站| 亚洲AV成人午夜亚洲美女| 亚洲AV无码男人的天堂| 亚洲丰满熟女一区二区V| 亚洲国产精品久久久久秋霞小| 视频一区二区三区日韩| 无码人妻精品内射一二三AV| 亚洲AV 无码片一区二区三区| 无码一区二区三区AⅤ免费蜜桃视 无码一区二区三区AⅤ免费麻豆 | 无码少妇一区二区三区芒果| 亚洲ⅤA中文字幕无码| 亚洲精品二区国产综合野狼| 一面膜上边一面膜下边韩国| 99久久久国产精品免费牛牛| 草草影院CCYY国产日本欧美| 啊灬啊别停灬用力啊| 搡老女人老熟妇HHD| 日韩无码视频一区| 国产成人精品综合久久久| 性色AV无码专区一ⅤA亚洲| 国产精品无码专区在线播放| 国产日产欧美一区二区蜜桃| AV无码AV在线A∨天堂毛片| JESSICAJAMES护士性| WWW夜片内射视频日韩精品成人| 成人无码网WWW在线观看| 国产成人亚洲精品无码H| 加勒比色综合久久久久久久久| 精品久久久中文字幕人妻| 美女扒开腿让男人桶爽免费 | 亚洲AV综合色区无码一区| 一本一道AV中文字幕无码| MM131美女图片高清图片视频| 国产成人亚洲精品无码综合原创| 极品丰满熟妇人妻无码| 男生女生差差差轮滑免费| 色哟哟免费精品网站入口| 亚洲成A人片在线观看国产| 中文字幕日本最新乱码视频| 俄罗斯另类ZOZO| 精产国品一二三产区区别在哪儿 | 部长的夫人的味道HD| 国产AV一区二区三区传媒| 精品乱子伦一区二区三区| 欧美黑人巨大精品VIDEOS | 亚洲色播爱爱爱爱爱爱爱| 做AJ姿势教程大全图片| 国产成人亚洲精品无码青青草原| 久久精品人妻一区二区三区av | 亚洲AV午夜成人片动漫番| 51久久精品人人搡人人玩| 国产成人AV区一区二区三| 久草玖玖玖爱在线资源| 日本不卡在线视频二区三区| 亚洲AV永久无码精品网站| 99精品视频九九精品视频| 国产精品久久久天天影视香蕉| 精品精品国产高清A级毛片| 国产极品视觉盛宴专区| 久久精品中文闷骚内射| 欧美猛少妇色XXXX久久久久| 午夜免费福利小电影| 97人妻人人揉人人躁人人| 国产线路3国产线路2| 欧美精品亚洲精品日韩专区VA| 亚洲 熟 图片 小说 乱 妇| JEAⅠOUSVUE成熟少归A| 久久精品WWW人人做人人爽| 天天躁狠狠躁狠狠躁性色AV| 99久久精品国产一区二区三区| 娇妻在卧室里被领导爽电影| 少妇性生生活视频在线观看| 97超级碰碰碰久久久久| 精品无码中文字幕在线| 无码人妻精品一区二区三| А√天堂资源中文最新版地址 | 亚洲顶级裸体AV片| 国产成人无码18禁午夜福利P| 欧美精品18VIDEOS性欧美| 亚洲一二三四2021不卡| 国产精品免费久久久久软件 | 久久精品国产亚洲AV久| 西西444WWW大胆无码视频| 产成人亚洲精品无码青青草原 | 人妻丰满熟妇AV无码区乱| 又粗又黄又猛又爽大片APP| 果冻传媒一区二区天美传媒| 熟妇人妻无乱码中文字幕蜜桃| WWW.COM.含羞草| 免费十大软件大全下载安装| 亚洲色无码国产精品网站可下载| 国产裸拍裸体视频在线观看| 三级无码在钱AV无码在钱| ASIAN明星裸体合成PICS| 老师黑色双开真丝旗袍| 亚洲老妈激情一区二区三区| 国产露脸ⅩXXXⅩ高清H| 特级做A爰片毛片免费69| 成人AV无码乱码在线观看无码| 哦┅┅快┅┅用力啊┅警花少妇 | 精品国产精品久久一区免费式| 五月丁香合缴情在线看| 国产AV大陆精品一区二区三区| 日本老肥婆BBBWBBBWZR| CHINESE呻吟VIDEOS| 免费免APP看大片视频播放器| 一边亲着一面膜下奶怎么回事| 精品日本一区二区三区免费 | 国产我和子的与子乱视频| 天天AV天天翘天天综合网| 高潮喷视频在线无码| 日日碰狠狠添天天爽无码| 波多野结衣Av无码久久一区二区| 欧美人与动牲交A免费观看| 竹菊影视欧美日韩一区二区三区四 | 少妇兽交PWWW综合网| 多毛BGMBGMBGM胖在线| 日韩精品无码一区二区中文字幕 | 亚洲欧美精品伊人久久| 狠狠噜天天噜日日噜视频麻豆 | 在图书馆揉捏她的双乳| 浪荡女天天不停挨CAO日常视频| 一本大道色卡1卡2卡3| 久久婷婷色综合老司机| 在线精品国产成人综合| 免费无码成人AV在线播放| 44分钟欧美人与禽交片MP4| 妺妺晚上扒我内裤玩我J| 91精品人妻一区二区三在线| 欧美大屁股流白浆XXXX视频| 99无人区码一码二码三码四码| 欧美黑人性暴力猛交喷水黑人巨大 | 99精品国产一区二区电影| 欧美黑人极品猛少妇色XXXXⅩ | 亚洲成A人片在线观看无遮挡 | 亚洲AV成人午夜电影在线观看| 国内精品免费视频自在线拍| 亚洲国产AV一区二区三区 | 亚洲精品亚洲人成人网| 久久九九兔免费精品6| 永久免费观看国产裸体美女| 奶头从情趣内衣下露了出来AV| AV片在线观看免费| 日本一本免费一区二区三区免| 番茄TODO社区免费看片| 无码专区6080YY电影| 狠狠躁夜夜躁青青草原软件| 亚洲一区二区三区自拍公司| 免费观看高清日本AⅤ| JZZIJZZIJ亚洲成熟少妇| 色猫咪AV在线网址| 国产日产欧产精品品不卡| 亚洲欧美性爱视频在线| 美女黄网站免费福利视频| 啊宝宝的扇贝真会夹C视频| 熟女俱乐部五十路六十路AV| 国内精品自线在拍大学生| 艳妇乳肉豪妇荡乳ⅩXXO电影| 免费国产VA在线观看中文字| 变态拳头交视频一区二区| 无码成人AⅤ免费中文字幕| 狠狠综合久久久久精品网站| 一区二区三区无码免费看| 琪琪电影网WWW888DVDC| 国产成人无码区免费A∨视频网站 国产成人无码免费视频在线 | 天堂AV亚洲ITV在线AⅤ| 好涨好爽好硬免费视频| 综合精品欧美日韩国产在线| 日本免费不卡在线观看的NV | 无码熟妇人妻AV在线影片| 久久久久久精品免费免费英国| FREE性玩弄少妇HD| 我半夜摸妺妺的奶C了她动漫| 精品无码国产AV一区二区三区| 377人体粉嫩噜噜噜| 日韩一区二区三区免费高清| 好男人好资源神马在线观看| 中文字幕在线精品视频入口一区| 日韩精品无码人妻免费视频| 国内精品国语自产拍在线观看| 中国丰满少妇性BBBBBBBB| 日韩夜夜高潮夜夜爽无码| 黑人巨大高潮喷水AV| 99久9在线 | 免费| 无码一区二区三区AV免费| 乱色熟女综合一区二区三区| 顶级欧美熟妇高潮XXXXX| 亚洲成人在线观看av| 欧美日韩不卡合集视频| 国产女人乱人伦精品一区二区| 英语老师乖乖挽起裙子怎么写作文| 人人人妻人人澡人人爽| 激情久久AV一区AV二区AV三| A在线视频播放观看免费观看 | 人人妻人人澡人人爽人人精品电影| 国偷自产视频一区二区久|