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

TS 類這十個知識點,你都掌握了么?

開發 前端
在面向對象語言中,類是一種面向對象計算機編程語言的構造,是創建對象的藍圖,描述了所創建的對象共同的屬性和方法。本文阿寶哥將跟大家一起學習一下 TS 類涉及的十個知識點。

[[429439]]

在面向對象語言中,類是一種面向對象計算機編程語言的構造,是創建對象的藍圖,描述了所創建的對象共同的屬性和方法。本文阿寶哥將跟大家一起學習一下 TS 類涉及的十個知識點。

一、類的屬性與方法

1.1 類的成員屬性和靜態屬性

在 TypeScript 中,我們可以通過 class 關鍵字來定義一個類:

  1. class Person { 
  2.   name: string; // 成員屬性 
  3.    
  4.   constructor(name: string) { // 類的構造函數 
  5.     this.name = name
  6.   } 

在以上代碼中,我們使用 class 關鍵字定義了一個 Person 類,該類含有一個名為 name 的成員屬性。其實 TypeScript 中的類是一個語法糖(所謂的語法糖就是在之前的某個語法的基礎上改變了一種寫法,實現的功能相同,但是寫法不同了,主要是為了讓開發人員在使用過程中更方便易懂。),若設置編譯目標為 ES5 將會產生以下代碼:

  1. "use strict"
  2. var Person = /** @class */ (function () { 
  3.     function Person(name) { 
  4.         this.name = name
  5.     } 
  6.     return Person; 
  7. }()); 

類除了可以定義成員屬性外,還可以通過 static 關鍵字定義靜態屬性:

  1. class Person { 
  2.   static cid: string = "exe"
  3.   name: string; // 成員屬性 
  4.    
  5.   constructor(name: string) { // 類的構造函數 
  6.     this.name = name
  7.   } 

那么成員屬性與靜態屬性有什么區別呢?在回答這個問題之前,我們先來看一下編譯生成的 ES5 代碼:

  1. "use strict"
  2. var Person = /** @class */ (function () { 
  3.     function Person(name) { 
  4.       this.name = name
  5.     } 
  6.     Person.cid = "exe"
  7.     return Person; 
  8. }()); 

觀察以上代碼可知,成員屬性是定義在類的實例上,而靜態屬性是定義在構造函數上。

1.2 類的成員方法和靜態方法

在 TS 類中,我們不僅可以定義成員屬性和靜態屬性,還可以定義成員方法和靜態方法,具體如下所示:

  1. class Person { 
  2.   static cid: string = "exe"
  3.   name: string; // 成員屬性 
  4.    
  5.   static printCid() { // 定義靜態方法 
  6.     console.log(Person.cid);   
  7.   } 
  8.  
  9.   constructor(name: string) { // 類的構造函數 
  10.     this.name = name
  11.   } 
  12.  
  13.   say(words: string) :void { // 定義成員方法 
  14.     console.log(`${this.name} says:${words}`);   
  15.   } 

那么成員方法與靜態方法有什么區別呢?同樣,在回答這個問題之前,我們先來看一下編譯生成的 ES5 代碼:

  1. "use strict"
  2. var Person = /** @class */ (function () { 
  3.     function Person(name) { 
  4.         this.name = name
  5.     } 
  6.     Person.printCid = function () { 
  7.         console.log(Person.cid); 
  8.     }; 
  9.     Person.prototype.say = function (words) { 
  10.         console.log(this.name + " says\uFF1A" + words); 
  11.     }; 
  12.     Person.cid = "exe"
  13.     return Person; 
  14. }()); 

由以上代碼可知,成員方法會被添加到構造函數的原型對象上,而靜態方法會被添加到構造函數上。

1.3 類成員方法重載

函數重載或方法重載是使用相同名稱和不同參數數量或類型創建多個方法的一種能力。 在定義類的成員方法時,我們也可以對成員方法進行重載:

  1. class Person { 
  2.   constructor(public name: string) {} 
  3.  
  4.   say(): void;  
  5.   say(words: string): void; 
  6.   say(words?: string) :void { // 方法重載 
  7.     if(typeof words === "string") { 
  8.         console.log(`${this.name} says:${words}`);   
  9.     } else { 
  10.         console.log(`${this.name} says:Nothing`);   
  11.     } 
  12.   } 
  13.  
  14. let p1 = new Person("Semlinker"); 
  15. p1.say(); 
  16. p1.say("Hello TS"); 

如果想進一步了解函數重載的話,可以繼續閱讀 是時候表演真正的技術了 - TS 分身之術 這一篇文章。

二、訪問器

在 TypeScript 中,我們可以通過 getter 和 setter 方法來實現數據的封裝和有效性校驗,防止出現異常數據。

  1. let passcode = "Hello TypeScript"
  2.  
  3. class Employee { 
  4.   private _fullName: string = ""
  5.  
  6.   get fullName(): string { 
  7.     return this._fullName; 
  8.   } 
  9.  
  10.   set fullName(newName: string) { 
  11.     if (passcode && passcode == "Hello TypeScript") { 
  12.       this._fullName = newName; 
  13.     } else { 
  14.       console.log("Error: Unauthorized update of employee!"); 
  15.     } 
  16.   } 
  17.  
  18. let employee = new Employee(); 
  19. employee.fullName = "Semlinker"

在以上代碼中,對于私有的 _fullName 屬性,我們通過對外提供 getter 和 setter 來控制該屬性的訪問和修改。

三、類的繼承

繼承(Inheritance)是一種聯結類與類的層次模型。指的是一個類(稱為子類、子接口)繼承另外的一個類(稱為父類、父接口)的功能,并可以增加它自己的新功能的能力,繼承是類與類或者接口與接口之間最常見的關系。通過類的繼承,我們可以實現代碼的復用。

繼承是一種 is-a 關系:

在 TypeScript 中,我們可以通過 extends 關鍵字來實現類的繼承:

3.1 父類

  1. class Person { 
  2.   constructor(public name: string) {} 
  3.  
  4.   public say(words: string) :void { 
  5.     console.log(`${this.name} says:${words}`);   
  6.   } 

3.2 子類

  1. class Developer extends Person { 
  2.   constructor(name: string) { 
  3.     super(name); 
  4.     this.say("Learn TypeScript"
  5.   } 
  6.  
  7. const p2 = new Developer("semlinker");  
  8. // 輸出: "semlinker says:Learn TypeScript"  

因為 Developer 類繼承了 Person 類,所以我們可以在 Developer 類的構造函數中調用 say 方法。需要注意的是,在 TypeScript 中使用 extends 時,只能繼承單個類:

  1. class Programmer {} 
  2.  
  3. // Classes can only extend a single class.(1174) 
  4. class Developer extends Person, Programmer { 
  5.   constructor(name: string) { 
  6.     super(name); 
  7.     this.say("Learn TypeScript"
  8.   } 

雖然在 TypeScript 中只允許單繼承,但卻允許我們實現多個接口。具體的使用示例如下所示:

  1. interface CanSay { 
  2.    say(words: string) :void  
  3.  
  4. interface CanWalk { 
  5.   walk(): void; 
  6.  
  7. class Person implements CanSay, CanWalk { 
  8.   constructor(public name: string) {} 
  9.  
  10.   public say(words: string) :void { 
  11.     console.log(`${this.name} says:${words}`);   
  12.   } 
  13.  
  14.   public walk(): void { 
  15.     console.log(`${this.name} walk with feet`); 
  16.   } 

此外,除了可以繼承具體的實現類之外,在實現繼承時,我們還可以繼承抽象類。

四、抽象類

使用 abstract 關鍵字聲明的類,我們稱之為抽象類。抽象類不能被實例化,因為它里面包含一個或多個抽象方法。 所謂的抽象方法,是指不包含具體實現的方法:

  1. abstract class Person { 
  2.   constructor(public name: string){} 
  3.  
  4.   abstract say(words: string) :void; 
  5.  
  6. // Cannot create an instance of an abstract class.(2511) 
  7. const lolo = new Person(); // Error 

抽象類不能被直接實例化,我們只能實例化實現了所有抽象方法的子類。具體如下所示:

  1. class Developer extends Person { 
  2.   constructor(name: string) { 
  3.     super(name); 
  4.   } 
  5.    
  6.   say(words: string): void { 
  7.     console.log(`${this.name} says ${words}`); 
  8.   } 
  9.  
  10. const lolo = new Developer("lolo"); 
  11. lolo.say("I love ts!"); // 輸出:lolo says I love ts! 

五、類訪問修飾

符在 TS 類型中,我們可以使用 public、protected 或 private 來描述該類屬性和方法的可見性。

5.1 public

public 修飾的屬性或者方法是公有的,可以在任何地方被訪問到,默認所有的屬性或者方法都是 public:

  1. class Person { 
  2.   constructor(public name: string) {} 
  3.  
  4.   public say(words: string) :void { 
  5.     console.log(`${this.name} says:${words}`);   
  6.   } 

5.2 protected

protected 修飾的屬性或者方法是受保護的,它和 private 類似,不同的地方是 protected 成員在派生類中仍然可以訪問。

  1. class Person { 
  2.   constructor(public name: string) {} 
  3.  
  4.   public say(words: string) :void { 
  5.     console.log(`${this.name} says:${words}`);   
  6.   } 
  7.  
  8.   protected getClassName() { 
  9.     return "Person"
  10.   } 
  11.  
  12. const p1 = new Person("lolo"); 
  13. p1.say("Learn TypeScript"); // Ok 
  14. // Property 'getClassName' is protected and only accessible within class 'Person' and its subclasses. 
  15. p1.getClassName() // Error 

由以上錯誤信息可知,使用 protected 修飾符修飾的方法,只能在當前類或它的子類中使用。

  1. class Developer extends Person { 
  2.   constructor(name: string) { 
  3.     super(name); 
  4.     console.log(`Base Class:${this.getClassName()}`); 
  5.   } 
  6.  
  7. const p2 = new Developer("semlinker"); // 輸出:"Base Class:Person"  

5.3 private

private 修飾的屬性或者方法是私有的,只能在類的內部進行訪問。

  1. class Person { 
  2.   constructor(private id: number, public name: string) {} 
  3.  
  4. const p1 = new Person(28, "lolo"); 
  5. // Property 'id' is private and only accessible within class 'Person'.(2341) 
  6. p1.id // Error 
  7. p1.name // OK 

由以上錯誤信息可知,使用 private 修飾符修飾的屬性,只能在當前類內部訪問。但真的是這樣么?其實這只是 TS 類型檢查器給我們的提示,在運行時我們還是可以訪問 Person 實例的 id 屬性。不相信的話,我們來看一下編譯生成的 ES5 代碼:

  1. "use strict"
  2. var Person = /** @class */ (function () { 
  3.     function Person(id, name) { 
  4.       this.id = id; 
  5.       this.name = name
  6.     } 
  7.     return Person; 
  8. }()); 
  9. var p1 = new Person(28, "lolo"); 

5.4 私有字段

針對上面的問題,TypeScript 團隊在 3.8 版本就開始支持 ECMAScript 私有字段,使用方式如下:

  1. class Person { 
  2.   #name: string; 
  3.  
  4.   constructor(name: string) { 
  5.     this.#name = name
  6.   } 
  7.  
  8. let semlinker = new Person("semlinker"); 
  9. // Property '#name' is not accessible outside class 'Person' because it has a private identifier. 
  10. semlinker.#name // Error 

那么 ECMAScript 私有字段 跟 private 修飾符相比,有什么特別之處么?這里我們來看一下編譯生成的 ES2015 代碼:

  1. "use strict"
  2. var __classPrivateFieldSet = // 省略相關代碼 
  3. var _Person_name; 
  4. class Person { 
  5.   constructor(name) { 
  6.     _Person_name.set(this, void 0); 
  7.     __classPrivateFieldSet(this, _Person_name, name"f"); 
  8.   } 
  9.  
  10. _Person_name = new WeakMap(); 
  11. let semlinker = new Person("Semlinker"); 

觀察以上的結果可知,在處理私有字段時使用到了 ES2015 新增的 WeakMap 數據類型,如果你對 WeakMap 還不了解的話,可以閱讀 你不知道的 WeakMap 這篇文章。下面我們來總結一下,私有字段與常規屬性(甚至使用 private 修飾符聲明的屬性)不同之處:

  • 私有字段以 # 字符開頭,有時我們稱之為私有名稱;
  • 每個私有字段名稱都唯一地限定于其包含的類;
  • 不能在私有字段上使用 TypeScript 可訪問性修飾符(如 public 或 private);
  • 私有字段不能在包含的類之外訪問,甚至不能被檢測到。

六、類表達式

TypeScript 1.6 添加了對 ES6 類表達式的支持。類表達式是用來定義類的一種語法。和函數表達式相同的一點是,類表達式可以是命名也可以是匿名的。如果是命名類表達式,這個名字只能在類體內部才能訪問到。

類表達式的語法如下所示([] 方括號表示是可選的):

  1. const MyClass = class [className] [extends] { 
  2.   // class body 
  3. }; 

基于類表達式的語法,我們可以定義一個 Point 類:

  1. let Point = class { 
  2.   constructor(public x: number, public y: number) {} 
  3.   public length() { 
  4.     return Math.sqrt(this.x * this.x + this.y * this.y); 
  5.   } 
  6.  
  7. let p = new Point(3, 4); 
  8. console.log(p.length()); // 輸出:5 

需要注意在使用類表達式定義類的時候,我們也可以使用 extends 關鍵字。篇幅有限,這里就不展開介紹了,感興趣的小伙伴可以自行測試一下。

七、泛型類

在類中使用泛型也很簡單,我們只需要在類名后面,使用

  1. class Person<T> { 
  2.   constructor( 
  3.     public cid: T,  
  4.     public name: string 
  5.   ) {}    
  6.  
  7. let p1 = new Person<number>(28, "Lolo"); 
  8. let p2 = new Person<string>("exe""Semlinker"); 

接下來我們以實例化 p1 為例,來分析一下其處理過程:

  • 在實例化 Person 對象時,我們傳入 number 類型和相應的構造參數;
  • 之后在 Person 類中,類型變量 T 的值變成 number 類型;
  • 最后構造函數 cid 的參數類型也會變成 number 類型。

相信看到這里一些讀者會有疑問,我們什么時候需要使用泛型呢?通常在決定是否使用泛型時,我們有以下兩個參考標準:

  • 當你的函數、接口或類將處理多種數據類型時;
  • 當函數、接口或類在多個地方使用該數據類型時。

八、構造簽名

在 TypeScript 接口中,你可以使用 new 關鍵字來描述一個構造函數:

  1. interface Point { 
  2.   new (x: number, y: number): Point; 

以上接口中的 new (x: number, y: number) 我們稱之為構造簽名,其語法如下:

  • ConstructSignature:new TypeParametersopt ( ParameterListopt ) TypeAnnotationopt

在上述的構造簽名中,TypeParametersopt 、ParameterListopt 和 TypeAnnotationopt 分別表示:可選的類型參數、可選的參數列表和可選的類型注解。那么了解構造簽名有什么用呢?這里我們先來看個例子:

  1. interface Point { 
  2.   new (x: number, y: number): Point; 
  3.   x: number; 
  4.   y: number; 
  5.  
  6. class Point2D implements Point { 
  7.   readonly x: number; 
  8.   readonly y: number; 
  9.  
  10.   constructor(x: number, y: number) { 
  11.     this.x = x; 
  12.     this.y = y; 
  13.   } 
  14.  
  15. const point: Point = new Point2D(1, 2); // Error 

對于以上的代碼,TypeScript 編譯器(v4.4.3)會提示以下錯誤信息:

  1. Type 'Point2D' is not assignable to type 'Point'
  2. Type 'Point2D' provides no match for the signature 'new (x: number, y: number): Point'

要解決這個問題,我們就需要把對前面定義的 Point 接口進行分離:

  1. interface Point { 
  2.   x: number; 
  3.   y: number; 
  4.  
  5. interface PointConstructor { 
  6.   new (x: number, y: number): Point; 

完成接口拆分之后,除了前面已經定義的 Point2D 類之外,我們又定義了一個 newPoint 工廠函數,該函數用于根據傳入的 PointConstructor 類型的構造函數,來創建對應的 Point 對象。

  1. class Point2D implements Point { 
  2.   readonly x: number; 
  3.   readonly y: number; 
  4.  
  5.   constructor(x: number, y: number) { 
  6.     this.x = x; 
  7.     this.y = y; 
  8.   } 
  9.  
  10. function newPoint( // 工廠方法 
  11.   pointConstructor: PointConstructor, 
  12.   x: number, 
  13.   y: number 
  14. ): Point { 
  15.   return new pointConstructor(x, y); 
  16.  
  17. const point: Point = newPoint(Point2D, 1, 2); 

九、抽象構造簽名

在 TypeScript 4.2 版本中引入了抽象構造簽名,用于解決以下的問題:

  1. type ConstructorFunction = new (...args: any[]) => any
  2.  
  3. abstract class Utilities {} 
  4.  
  5. // Type 'typeof Utilities' is not assignable to type 'ConstructorFunction'
  6. // Cannot assign an abstract constructor type to a non-abstract constructor type. 
  7. let UtilityClass: ConstructorFunction = Utilities; // Error. 

由以上的錯誤信息可知,我們不能把抽象構造器類型分配給非抽象的構造器類型。針對這個問題,我們需要使用 abstract 修飾符:

  1. declare type ConstructorFunction = abstract new (...args: any[]) => any

需要注意的是,對于抽象構造器類型,我們也可以傳入具體的實現類:

  1. declare type ConstructorFunction = abstract new (...args: any[]) => any
  2.  
  3. abstract class Utilities {} 
  4. class UtilitiesConcrete extends Utilities {} 
  5.  
  6. let UtilityClass: ConstructorFunction = Utilities; // Ok 
  7. let UtilityClass1: ConstructorFunction = UtilitiesConcrete; // Ok 

而對于 TypeScript 4.2 以下的版本,我們可以通過以下方式來解決上面的問題:

  1. type Constructor<T> = Function & { prototype: T } 
  2.  
  3. abstract class Utilities {} 
  4.  
  5. class UtilitiesConcrete extends Utilities {} 
  6.  
  7. let UtilityClass: Constructor<Utilities> = Utilities; 
  8. let UtilityClass1: Constructor<UtilitiesConcrete> = UtilitiesConcrete; 

介紹完抽象構造簽名,最后我們來簡單介紹一下 class type 與 typeof class type 的區別。

十、class type 與 typeof class type

  1. class Person { 
  2.   static cid: string = "exe"
  3.   name: string; // 成員屬性 
  4.    
  5.   static printCid() { // 定義靜態方法 
  6.     console.log(Person.cid);   
  7.   } 
  8.  
  9.   constructor(name: string) { // 類的構造函數 
  10.     this.name = name
  11.   } 
  12.  
  13.   say(words: string) :void { // 定義成員方法 
  14.     console.log(`${this.name} says:${words}`);   
  15.   } 
  16.  
  17. // Property 'say' is missing in type 'typeof Person' but required in type 'Person'
  18. let p1: Person = Person; // Error 
  19. let p2: Person = new Person("Semlinker"); // Ok 
  20.  
  21. // Type 'Person' is missing the following properties from type 'typeof Person': prototype, cid, printCid 
  22. let p3: typeof Person = new Person("Lolo"); // Error 
  23. let p4: typeof Person = Person; // Ok 

通過觀察以上的代碼,我們可以得出以下結論:

  • 當使用 Person 類作為類型時,可以約束變量的值必須為 Person 類的實例;
  • 當使用 typeof Person 作為類型時,可以約束變量的值必須包含該類上的靜態屬性和方法。

此外,需要注意的是 TypeScript 使用的是 結構化 類型系統,與 Java/C++ 所采用的 名義化 類型系統是不一樣的,所以以下代碼在 TS 中是可以正常運行的:

  1. class Person { 
  2.   constructor(public name: string) {}   
  3.  
  4. class SuperMan { 
  5.   constructor(public name: string) {}   
  6.  
  7. let p1: SuperMan = new Person("Semlinker"); // Ok 

好的,在日常工作中,TypeScript 類比較常見的知識,就介紹到這里。

本文轉載自微信公眾號「全棧修仙之路」

 

責任編輯:姜華 來源: 全棧修仙之路
相關推薦

2010-03-09 17:30:08

Linux新手知識點

2025-04-01 08:25:00

OSPF網絡IT

2023-12-22 15:32:20

2023-12-23 11:15:25

2024-12-27 08:59:01

2019-07-11 14:45:52

簡歷編程項目

2010-03-18 13:48:14

Linux新手

2011-08-16 13:15:15

MongoDB

2018-11-16 16:13:33

5G通信技術網絡

2025-08-21 09:35:29

2009-06-24 10:45:42

Linux

2024-05-16 08:26:24

開發技巧項目

2020-08-11 17:14:31

數據庫SQL技術

2025-08-12 07:37:44

2024-07-16 10:13:01

2019-11-29 14:56:14

語音交互機器人聊天

2025-10-13 01:00:00

2025-01-20 00:06:13

2019-11-12 14:50:49

Windows電腦Windows 10

2022-05-16 07:48:54

Python操作類型
點贊
收藏

51CTO技術棧公眾號

亚洲成人av资源网| 一区二区三区国产| 国产欧美精品xxxx另类| 黄色一级片中国| 麻豆一区二区| 欧美日韩高清影院| 久草视频这里只有精品| 九色国产在线观看| 国产一区二区三区在线观看免费| 久久久免费电影| 久久久精品成人| 国内露脸中年夫妇交换精品| 在线观看不卡一区| a级片一区二区| 九色网友自拍视频手机在线| 国产精品一区二区在线观看网站 | 久久久久国产精品无码免费看| 26uuu亚洲电影| 一区二区三区在线免费视频| 欧美lavv| 性生活三级视频| 日本不卡不码高清免费观看| 久久久亚洲影院| 一区二区三区影视| 精品一区不卡| 亚洲精品一区二三区不卡| 天堂网成人在线| 欧美暴力调教| 欧美午夜xxx| 无码人妻精品一区二区蜜桃网站| www.黄在线观看| 久久综合九色综合97婷婷女人 | 中文字幕一区二区三区四区| 乱色588欧美| 好吊色一区二区| 国产乱人伦精品一区二区在线观看 | 国产中文字幕久久| 亚洲午夜久久| 亚洲精品一二区| 捆绑裸体绳奴bdsm亚洲| 91综合久久爱com| 欧美一区二区日韩| 狠狠干狠狠操视频| av成人在线看| 欧美在线三级电影| 亚洲色欲综合一区二区三区| 白浆在线视频| 亚洲一本大道在线| 日韩久久久久久久久久久久| 成人黄视频在线观看| 国产精品国产三级国产有无不卡| 日本不卡高清视频一区| 免费一级在线观看| 久久九九久精品国产免费直播| 久久精品国产精品青草色艺 | 亚洲深夜福利视频| 玖玖爱在线观看| 爽爽窝窝午夜精品一区二区| 亚洲电影免费观看高清完整版在线观看 | 捆绑调教一区二区三区| 国产精品亚洲网站| 艳妇乳肉豪妇荡乳av| 麻豆国产精品视频| 成人免费看片视频| 99久久婷婷国产一区二区三区| 激情文学综合插| 91一区二区三区| 丰满人妻av一区二区三区| 懂色中文一区二区在线播放| 国产精品一区二区三区精品| 亚洲 欧美 自拍偷拍| 久久网这里都是精品| 视频二区一区| 免费看a在线观看| 亚洲免费在线视频一区 二区| 91成人在线视频观看| 国产精品69xx| 精品欧美激情精品一区| 亚洲无吗一区二区三区| 成人51免费| 精品国产乱码久久久久久老虎 | www.欧美日本| 三级成人黄色影院| 欧美另类变人与禽xxxxx| 四虎1515hh.com| 国产福利资源一区| 亚洲天堂av在线免费观看| jizzjizz日本少妇| 韩日视频一区| 国产精品久久久久99| 91麻豆视频在线观看| 高清成人免费视频| 日韩av一区二区三区在线| 北岛玲日韩精品一区二区三区| 18成人在线观看| 国产真人做爰毛片视频直播| 三级成人黄色影院| 日韩精品在线一区二区| 魔女鞋交玉足榨精调教| 亚洲第一天堂| 日本成人免费在线| www.国产.com| 国产欧美日本一区二区三区| 日本黄色片一级片| 51一区二区三区| 亚洲成人激情在线| 手机看片国产日韩| 亚洲片区在线| 亚洲自拍另类欧美丝袜| 青青青草网站免费视频在线观看| 日韩一区欧美一区| 黄色片久久久久| 一区二区三区在线资源| 在线观看日韩av| 日韩av在线电影| 国产一级精品在线| 色视频一区二区三区| 密臀av在线播放| 日韩西西人体444www| 99在线视频免费| 国产欧美日韩综合一区在线播放| 亚洲一区二区三区777| 国产中文在线视频| 午夜精品久久久久久久99水蜜桃| 亚洲图片 自拍偷拍| 精品国产乱码久久久久久蜜坠欲下| 久久久久久成人| 国产伦子伦对白视频| 国产日产欧美一区| 一本大道熟女人妻中文字幕在线| 一区二区三区高清在线观看| 日韩在线观看免费av| 天天综合久久综合| 久久久美女毛片| 国产原创中文在线观看| 高清日韩中文字幕| 欧美另类交人妖| 国产精品无码久久久久成人app| 日本一区二区三级电影在线观看| 日韩欧美精品在线观看视频| 麻豆一区一区三区四区| 性欧美视频videos6一9| 亚洲精品国产精品国| 一区二区三区在线视频观看| 中文字幕第10页| 中文字幕一区二区三区欧美日韩 | 国产综合久久久| 日本一区二区不卡| 国产日产精品久久久久久婷婷| 天天操天天综合网| 少妇按摩一区二区三区| 亚洲一区免费| 欧美精品尤物在线| 三级成人黄色影院| 色视频www在线播放国产成人| 中文无码av一区二区三区| 亚洲国产高清在线观看视频| 91日韩视频在线观看| 色135综合网| 91在线观看免费观看| 亚洲丝袜一区| 精品国产乱码久久久久久浪潮| www.99re7.com| 99在线精品观看| 激情网站五月天| 欧美在线色图| 91精品视频在线看| 丁香花在线高清完整版视频| 亚洲国产精彩中文乱码av| 欧美bbbbbbbbbbbb精品| 久久久三级国产网站| 91制片厂毛片| 午夜亚洲福利| 九九九热999| jizz亚洲女人高潮大叫| 欧美乱妇40p| 视频福利在线| 欧美性色欧美a在线播放| 国产小视频你懂的| www.欧美亚洲| 亚洲第一中文av| 午夜欧美视频| 欧美高清性xxxxhd| 91麻豆精品| 51色欧美片视频在线观看| 91激情在线| 精品国产乱码久久久久久浪潮 | 小泽玛利亚一区二区免费| 成人精品免费视频| 99热这里只有精品在线播放| 欧美成熟视频| 欧美一区激情视频在线观看| 亚洲图片小说区| 91成人在线观看国产| 亚洲成人影院麻豆| 亚洲缚视频在线观看| 欧美性受xxx黑人xyx性爽| 亚洲欧美一区二区三区久本道91| 亚洲观看黄色网| 久久99久国产精品黄毛片色诱| 日韩欧美不卡在线| 久久综合成人| 久久免费看av| 亚洲综合影院| 国产精品中文字幕久久久| 国产三级电影在线播放| 精品国产一区久久久| 欧美孕妇性xxxⅹ精品hd| 日韩一级完整毛片| 国内av在线播放| 精品欧美激情精品一区| 成熟的女同志hd| 国产精品美女久久久久久久久久久| 在线免费看黄色片| 国产精品一二三在| 久久婷五月综合| 日日骚欧美日韩| 欧美,日韩,国产在线| 中文字幕乱码亚洲无线精品一区| 奇米888一区二区三区| 99精品在免费线中文字幕网站一区| 国产精品自产拍在线观看| 中文字幕在线官网| 97国产精品视频人人做人人爱| 欧美精品电影| 尤物九九久久国产精品的分类| 五月激情婷婷网| 精品奇米国产一区二区三区| 国产精品久久久久久久一区二区| 在线观看日韩国产| 潘金莲一级淫片aaaaaa播放| 精品欧美国产一区二区三区| 国产午夜精品一区二区理论影院| 亚洲女子a中天字幕| www.97视频| 国产精品白丝在线| 国产又粗又长又黄的视频| 日本一区二区在线不卡| 欧美黄色一级生活片| 91麻豆福利精品推荐| 亚洲欧美日韩色| 成人av综合一区| 亚洲精品乱码久久久久久蜜桃图片| 丁香亚洲综合激情啪啪综合| 99riav国产精品视频| 国产成人自拍网| 中文字幕在线播放一区二区| 国产激情一区二区三区| 精品无码av一区二区三区不卡| 国内成+人亚洲+欧美+综合在线| 亚洲三级在线观看视频| 国产在线播放一区三区四| 91网址在线观看精品| 国产精品综合在线视频| 亚洲女则毛耸耸bbw| 成人久久18免费网站麻豆| 丰满岳乱妇一区二区| 99re热这里只有精品视频| 国产ts丝袜人妖系列视频| 91视频一区二区| 国产又粗又猛又爽视频| 国产欧美日韩激情| 网站永久看片免费| 亚洲欧美日韩系列| 久久久久亚洲av无码专区| 午夜精品久久久久久久久久| 亚洲不卡视频在线观看| 欧美日韩高清一区二区三区| www.成人精品| 亚洲精品影视在线观看| 95在线视频| 欧美成人免费全部观看天天性色| 黑人精品视频| 欧美中文在线免费| 国产精品99久久久久久董美香| 96pao国产成视频永久免费| 北条麻妃在线一区二区免费播放 | 国产精品成久久久久三级 | 国产欧美日韩综合一区在线观看 | 亚洲另类图片色| 1769在线观看| 欧美国产极速在线| 国产日韩另类视频一区| 亚洲自拍偷拍色片视频| 香蕉人人精品| 欧美日韩亚洲国产成人| 一本久道久久综合狠狠爱| 欧美午夜aaaaaa免费视频| 国产成人免费视频网站 | 一区二区在线| 鲁一鲁一鲁一鲁一澡| 激情综合五月婷婷| 在线 丝袜 欧美 日韩 制服| 亚洲图片欧美激情| 成年人视频在线免费看| 欧美顶级少妇做爰| 飘雪影视在线观看免费观看 | 秋霞在线观看一区二区三区| 在线精品国产| av无码精品一区二区三区| 国产v综合v亚洲欧| 中文字幕在线观看二区| 午夜免费久久看| 国产欧美久久久精品免费| 亚洲裸体xxxx| 精品一性一色一乱农村| 国产男人精品视频| 少妇精品久久久| 成人在线视频一区二区三区| 奇米在线7777在线精品| av网站有哪些| 亚洲一区二区三区四区的| 日本成人一级片| 亚洲理论在线a中文字幕| 丁香花在线高清完整版视频| 亚洲va欧美va在线观看| av伊人久久| 黑人糟蹋人妻hd中文字幕| 国产精品白丝jk白祙喷水网站| 亚洲综合欧美综合| 欧美日韩免费网站| 成人毛片在线免费观看| 日韩色av导航| 福利一区和二区| 色播亚洲婷婷| 首页亚洲欧美制服丝腿| 男女黄床上色视频| 午夜视频一区二区| 朝桐光av在线一区二区三区| 久久久www成人免费精品| 国产精品久久久久久久久久齐齐| 久久精品国产美女| 亚洲日本黄色| 亚洲色偷偷色噜噜狠狠99网| 亚洲一区二区综合| 精品人妻无码一区二区| 久久精品青青大伊人av| 日韩毛片免费看| 一区二区三区免费看| 美腿丝袜亚洲一区| 亚洲AV成人无码网站天堂久久| 欧美性感一区二区三区| аⅴ资源新版在线天堂| 国产精品自产拍高潮在线观看| 欧美综合久久| 三上悠亚在线一区二区| 国产精品人人做人人爽人人添| 国模私拍一区二区| xxxx性欧美| 一区二区在线视频观看| 久久人人爽人人爽人人av| 成人亚洲一区二区一| 国产做受高潮漫动| 日韩精品在线第一页| 欧美成人h版| 亚洲激情啪啪| 九一久久久久久| 欧美黑人猛猛猛| 亚洲精品一区二区三区99| 丝袜美腿av在线| 精品一区二区三区自拍图片区| 99精品久久久| 国产123在线| 91精品国产一区二区三区| 日本欧美电影在线观看| 久久久国产精品一区二区三区| 丝袜亚洲另类丝袜在线| 91社区视频在线观看| 欧美一区二区高清| ****av在线网毛片| 欧美一区二区福利| 久久99精品国产91久久来源| 高h视频免费观看| 亚洲国产女人aaa毛片在线| 亚洲深夜视频| 致1999电视剧免费观看策驰影院| 国产99一区视频免费| 五月天激情国产综合婷婷婷| 中文字幕国产精品| 97成人在线| 老司机午夜av| 有码一区二区三区| 欧美女同网站| 亚洲自拍偷拍福利| 另类天堂av| 精品欧美一区二区久久久久| 精品中文字幕久久久久久| 欧美激情啪啪| aa在线观看视频| 亚洲欧洲日本在线| 熟妇人妻中文av无码| 国产美女精品视频| 亚洲色诱最新| 尤物在线免费视频| 亚洲精品一区av在线播放| 欧美成年网站| 青青青在线视频免费观看| 亚洲国产精品一区二区www在线| av在线天堂播放| 久久99精品国产99久久|