国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

ECMAScript 6 入門教程—Class 的基本語法

共 14765字,需瀏覽 30分鐘

 ·

2020-10-23 15:02

作者 | 阮一峰

1、簡(jiǎn)介

類的由來

JavaScript 語言中,生成實(shí)例對(duì)象的傳統(tǒng)方法是通過構(gòu)造函數(shù)。下面是一個(gè)例子。
function Point(x, y) {
this.x = x;
this.y = y;
}

Point.prototype.toString = function () {
return '(' + this.x + ', ' + this.y + ')';
};

var p = new Point(1, 2);
上面這種寫法跟傳統(tǒng)的面向?qū)ο笳Z言(比如 C++ 和 Java)差異很大,很容易讓新學(xué)習(xí)這門語言的程序員感到困惑。
ES6 提供了更接近傳統(tǒng)語言的寫法,引入了 Class(類)這個(gè)概念,作為對(duì)象的模板。通過class關(guān)鍵字,可以定義類。
基本上,ES6 的class可以看作只是一個(gè)語法糖,它的絕大部分功能,ES5 都可以做到,新的class寫法只是讓對(duì)象原型的寫法更加清晰、更像面向?qū)ο缶幊痰恼Z法而已。上面的代碼用 ES6 的class改寫,就是下面這樣。
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}

toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
上面代碼定義了一個(gè)“類”,可以看到里面有一個(gè)constructor方法,這就是構(gòu)造方法,而this關(guān)鍵字則代表實(shí)例對(duì)象。也就是說,ES5 的構(gòu)造函數(shù)Point,對(duì)應(yīng) ES6 的Point類的構(gòu)造方法。
Point類除了構(gòu)造方法,還定義了一個(gè)toString方法。注意,定義“類”的方法的時(shí)候,前面不需要加上function這個(gè)關(guān)鍵字,直接把函數(shù)定義放進(jìn)去了就可以了。另外,方法之間不需要逗號(hào)分隔,加了會(huì)報(bào)錯(cuò)。
ES6 的類,完全可以看作構(gòu)造函數(shù)的另一種寫法。
class Point {
// ...
}

typeof Point // "function"
Point === Point.prototype.constructor // true
上面代碼表明,類的數(shù)據(jù)類型就是函數(shù),類本身就指向構(gòu)造函數(shù)。
使用的時(shí)候,也是直接對(duì)類使用new命令,跟構(gòu)造函數(shù)的用法完全一致。
class Bar {
doStuff() {
console.log('stuff');
}
}

var b = new Bar();
b.doStuff() // "stuff"
構(gòu)造函數(shù)的prototype屬性,在 ES6 的“類”上面繼續(xù)存在。事實(shí)上,類的所有方法都定義在類的prototype屬性上面。
class Point {
constructor() {
// ...
}

toString() {
// ...
}

toValue() {
// ...
}
}

// 等同于

Point.prototype = {
constructor() {},
toString() {},
toValue() {},
};
在類的實(shí)例上面調(diào)用方法,其實(shí)就是調(diào)用原型上的方法。
class B {}
let b = new B();

b.constructor === B.prototype.constructor // true
上面代碼中,b是B類的實(shí)例,它的constructor方法就是B類原型的constructor方法。
由于類的方法都定義在prototype對(duì)象上面,所以類的新方法可以添加在prototype對(duì)象上面。Object.assign方法可以很方便地一次向類添加多個(gè)方法。
class Point {
constructor(){
// ...
}
}

Object.assign(Point.prototype, {
toString(){},
toValue(){}
});
prototype對(duì)象的constructor屬性,直接指向“類”的本身,這與 ES5 的行為是一致的。
Point.prototype.constructor === Point // true
另外,類的內(nèi)部所有定義的方法,都是不可枚舉的(non-enumerable)。
class Point {
constructor(x, y) {
// ...
}

toString() {
// ...
}
}

Object.keys(Point.prototype)
// []
Object.getOwnPropertyNames(Point.prototype)
// ["constructor","toString"]
上面代碼中,toString方法是Point類內(nèi)部定義的方法,它是不可枚舉的。這一點(diǎn)與 ES5 的行為不一致。
var Point = function (x, y) {
// ...
};

Point.prototype.toString = function() {
// ...
};

Object.keys(Point.prototype)
// ["toString"]
Object.getOwnPropertyNames(Point.prototype)
// ["constructor","toString"]
上面代碼采用 ES5 的寫法,toString方法就是可枚舉的。

constructor 方法

constructor方法是類的默認(rèn)方法,通過new命令生成對(duì)象實(shí)例時(shí),自動(dòng)調(diào)用該方法。一個(gè)類必須有constructor方法,如果沒有顯式定義,一個(gè)空的constructor方法會(huì)被默認(rèn)添加。
class Point {
}

// 等同于
class Point {
constructor() {}
}
上面代碼中,定義了一個(gè)空的類Point,JavaScript 引擎會(huì)自動(dòng)為它添加一個(gè)空的constructor方法。
constructor方法默認(rèn)返回實(shí)例對(duì)象(即this),完全可以指定返回另外一個(gè)對(duì)象。
class Foo {
constructor() {
return Object.create(null);
}
}

new Foo() instanceof Foo
// false
上面代碼中,constructor函數(shù)返回一個(gè)全新的對(duì)象,結(jié)果導(dǎo)致實(shí)例對(duì)象不是Foo類的實(shí)例。
類必須使用new調(diào)用,否則會(huì)報(bào)錯(cuò)。這是它跟普通構(gòu)造函數(shù)的一個(gè)主要區(qū)別,后者不用new也可以執(zhí)行。
class Foo {
constructor() {
return Object.create(null);
}
}

Foo()
// TypeError: Class constructor Foo cannot be invoked without 'new'

類的實(shí)例

生成類的實(shí)例的寫法,與 ES5 完全一樣,也是使用new命令。前面說過,如果忘記加上new,像函數(shù)那樣調(diào)用Class,將會(huì)報(bào)錯(cuò)。
class Point {
// ...
}

// 報(bào)錯(cuò)
var point = Point(2, 3);

// 正確
var point = new Point(2, 3);
與 ES5 一樣,實(shí)例的屬性除非顯式定義在其本身(即定義在this對(duì)象上),否則都是定義在原型上(即定義在class上)。
//定義類
class Point {

constructor(x, y) {
this.x = x;
this.y = y;
}

toString() {
return '(' + this.x + ', ' + this.y + ')';
}

}

var point = new Point(2, 3);

point.toString() // (2, 3)

point.hasOwnProperty('x') // true
point.hasOwnProperty('y') // true
point.hasOwnProperty('toString') // false
point.__proto__.hasOwnProperty('toString') // true
上面代碼中,x和y都是實(shí)例對(duì)象point自身的屬性(因?yàn)槎x在this變量上),所以hasOwnProperty方法返回true,而toString是原型對(duì)象的屬性(因?yàn)槎x在Point類上),所以hasOwnProperty方法返回false。這些都與 ES5 的行為保持一致。
與 ES5 一樣,類的所有實(shí)例共享一個(gè)原型對(duì)象。
var p1 = new Point(2,3);
var p2 = new Point(3,2);

p1.__proto__ === p2.__proto__
//true
上面代碼中,p1和p2都是Point的實(shí)例,它們的原型都是Point.prototype,所以__proto__屬性是相等的。
這也意味著,可以通過實(shí)例的__proto__屬性為“類”添加方法。
__proto__?并不是語言本身的特性,這是各大廠商具體實(shí)現(xiàn)時(shí)添加的私有屬性,雖然目前很多現(xiàn)代瀏覽器的 JS 引擎中都提供了這個(gè)私有屬性,但依舊不建議在生產(chǎn)中使用該屬性,避免對(duì)環(huán)境產(chǎn)生依賴。生產(chǎn)環(huán)境中,我們可以使用?Object.getPrototypeOf?方法來獲取實(shí)例對(duì)象的原型,然后再來為原型添加方法/屬性。
var p1 = new Point(2,3);
var p2 = new Point(3,2);

p1.__proto__.printName = function () { return 'Oops' };

p1.printName() // "Oops"
p2.printName() // "Oops"

var p3 = new Point(4,2);
p3.printName() // "Oops"
上面代碼在p1的原型上添加了一個(gè)printName方法,由于p1的原型就是p2的原型,因此p2也可以調(diào)用這個(gè)方法。而且,此后新建的實(shí)例p3也可以調(diào)用這個(gè)方法。這意味著,使用實(shí)例的__proto__屬性改寫原型,必須相當(dāng)謹(jǐn)慎,不推薦使用,因?yàn)檫@會(huì)改變“類”的原始定義,影響到所有實(shí)例。

取值函數(shù)(getter)和存值函數(shù)(setter)

與 ES5 一樣,在“類”的內(nèi)部可以使用get和set關(guān)鍵字,對(duì)某個(gè)屬性設(shè)置存值函數(shù)和取值函數(shù),攔截該屬性的存取行為。
class MyClass {
constructor() {
// ...
}
get prop() {
return 'getter';
}
set prop(value) {
console.log('setter: '+value);
}
}

let inst = new MyClass();

inst.prop = 123;
// setter: 123

inst.prop
// 'getter'
上面代碼中,prop屬性有對(duì)應(yīng)的存值函數(shù)和取值函數(shù),因此賦值和讀取行為都被自定義了。
存值函數(shù)和取值函數(shù)是設(shè)置在屬性的 Descriptor 對(duì)象上的。
class CustomHTMLElement {
constructor(element) {
this.element = element;
}

get html() {
return this.element.innerHTML;
}

set html(value) {
this.element.innerHTML = value;
}
}

var descriptor = Object.getOwnPropertyDescriptor(
CustomHTMLElement.prototype, "html"
);

"get" in descriptor // true
"set" in descriptor // true
上面代碼中,存值函數(shù)和取值函數(shù)是定義在html屬性的描述對(duì)象上面,這與 ES5 完全一致。

屬性表達(dá)式

類的屬性名,可以采用表達(dá)式。
let methodName = 'getArea';

class Square {
constructor(length) {
// ...
}

[methodName]() {
// ...
}
}
上面代碼中,Square類的方法名getArea,是從表達(dá)式得到的。

Class 表達(dá)式

與函數(shù)一樣,類也可以使用表達(dá)式的形式定義。
const MyClass = class Me {
getClassName() {
return Me.name;
}
};
上面代碼使用表達(dá)式定義了一個(gè)類。需要注意的是,這個(gè)類的名字是Me,但是Me只在 Class 的內(nèi)部可用,指代當(dāng)前類。在 Class 外部,這個(gè)類只能用MyClass引用。
let inst = new MyClass();
inst.getClassName() // Me
Me.name // ReferenceError: Me is not defined
上面代碼表示,Me只在 Class 內(nèi)部有定義。
如果類的內(nèi)部沒用到的話,可以省略Me,也就是可以寫成下面的形式。
const MyClass = class { /* ... */ };
采用 Class 表達(dá)式,可以寫出立即執(zhí)行的 Class。
let person = new class {
constructor(name) {
this.name = name;
}

sayName() {
console.log(this.name);
}
}('張三');

person.sayName(); // "張三"
上面代碼中,person是一個(gè)立即執(zhí)行的類的實(shí)例。

注意點(diǎn)

(1)嚴(yán)格模式
類和模塊的內(nèi)部,默認(rèn)就是嚴(yán)格模式,所以不需要使用use strict指定運(yùn)行模式。只要你的代碼寫在類或模塊之中,就只有嚴(yán)格模式可用??紤]到未來所有的代碼,其實(shí)都是運(yùn)行在模塊之中,所以 ES6 實(shí)際上把整個(gè)語言升級(jí)到了嚴(yán)格模式。
(2)不存在提升
類不存在變量提升(hoist),這一點(diǎn)與 ES5 完全不同。
new Foo(); // ReferenceError
class Foo {}
上面代碼中,F(xiàn)oo類使用在前,定義在后,這樣會(huì)報(bào)錯(cuò),因?yàn)?ES6 不會(huì)把類的聲明提升到代碼頭部。這種規(guī)定的原因與下文要提到的繼承有關(guān),必須保證子類在父類之后定義。
{
let Foo = class {};
class Bar extends Foo {
}
}
上面的代碼不會(huì)報(bào)錯(cuò),因?yàn)锽ar繼承Foo的時(shí)候,F(xiàn)oo已經(jīng)有定義了。但是,如果存在class的提升,上面代碼就會(huì)報(bào)錯(cuò),因?yàn)閏lass會(huì)被提升到代碼頭部,而let命令是不提升的,所以導(dǎo)致Bar繼承Foo的時(shí)候,F(xiàn)oo還沒有定義。
(3)name 屬性
由于本質(zhì)上,ES6 的類只是 ES5 的構(gòu)造函數(shù)的一層包裝,所以函數(shù)的許多特性都被Class繼承,包括name屬性。
class Point {}
Point.name // "Point"
name屬性總是返回緊跟在class關(guān)鍵字后面的類名。
(4)Generator 方法
如果某個(gè)方法之前加上星號(hào)(*),就表示該方法是一個(gè) Generator 函數(shù)。
class Foo {
constructor(...args) {
this.args = args;
}
* [Symbol.iterator]() {
for (let arg of this.args) {
yield arg;
}
}
}

for (let x of new Foo('hello', 'world')) {
console.log(x);
}
// hello
// world
上面代碼中,F(xiàn)oo類的Symbol.iterator方法前有一個(gè)星號(hào),表示該方法是一個(gè) Generator 函數(shù)。Symbol.iterator方法返回一個(gè)Foo類的默認(rèn)遍歷器,for...of循環(huán)會(huì)自動(dòng)調(diào)用這個(gè)遍歷器。
(5)this 的指向
類的方法內(nèi)部如果含有this,它默認(rèn)指向類的實(shí)例。但是,必須非常小心,一旦單獨(dú)使用該方法,很可能報(bào)錯(cuò)。
class Logger {
printName(name = 'there') {
this.print(`Hello ${name}`);
}

print(text) {
console.log(text);
}
}

const logger = new Logger();
const { printName } = logger;
printName(); // TypeError: Cannot read property 'print' of undefined
上面代碼中,printName方法中的this,默認(rèn)指向Logger類的實(shí)例。但是,如果將這個(gè)方法提取出來單獨(dú)使用,this會(huì)指向該方法運(yùn)行時(shí)所在的環(huán)境(由于 class 內(nèi)部是嚴(yán)格模式,所以 this 實(shí)際指向的是undefined),從而導(dǎo)致找不到print方法而報(bào)錯(cuò)。
一個(gè)比較簡(jiǎn)單的解決方法是,在構(gòu)造方法中綁定this,這樣就不會(huì)找不到print方法了。
class Logger {
constructor() {
this.printName = this.printName.bind(this);
}

// ...
}
另一種解決方法是使用箭頭函數(shù)。
class Obj {
constructor() {
this.getThis = () => this;
}
}

const myObj = new Obj();
myObj.getThis() === myObj // true
箭頭函數(shù)內(nèi)部的this總是指向定義時(shí)所在的對(duì)象。上面代碼中,箭頭函數(shù)位于構(gòu)造函數(shù)內(nèi)部,它的定義生效的時(shí)候,是在構(gòu)造函數(shù)執(zhí)行的時(shí)候。這時(shí),箭頭函數(shù)所在的運(yùn)行環(huán)境,肯定是實(shí)例對(duì)象,所以this會(huì)總是指向?qū)嵗龑?duì)象。
還有一種解決方法是使用Proxy,獲取方法的時(shí)候,自動(dòng)綁定this。
function selfish (target) {
const cache = new WeakMap();
const handler = {
get (target, key) {
const value = Reflect.get(target, key);
if (typeof value !== 'function') {
return value;
}
if (!cache.has(value)) {
cache.set(value, value.bind(target));
}
return cache.get(value);
}
};
const proxy = new Proxy(target, handler);
return proxy;
}

const logger = selfish(new Logger());

2、靜態(tài)方法

類相當(dāng)于實(shí)例的原型,所有在類中定義的方法,都會(huì)被實(shí)例繼承。如果在一個(gè)方法前,加上static關(guān)鍵字,就表示該方法不會(huì)被實(shí)例繼承,而是直接通過類來調(diào)用,這就稱為“靜態(tài)方法”。
class Foo {
static classMethod() {
return 'hello';
}
}

Foo.classMethod() // 'hello'

var foo = new Foo();
foo.classMethod()
// TypeError: foo.classMethod is not a function
上面代碼中,F(xiàn)oo類的classMethod方法前有static關(guān)鍵字,表明該方法是一個(gè)靜態(tài)方法,可以直接在Foo類上調(diào)用(Foo.classMethod()),而不是在Foo類的實(shí)例上調(diào)用。如果在實(shí)例上調(diào)用靜態(tài)方法,會(huì)拋出一個(gè)錯(cuò)誤,表示不存在該方法。
注意,如果靜態(tài)方法包含this關(guān)鍵字,這個(gè)this指的是類,而不是實(shí)例。
class Foo {
static bar() {
this.baz();
}
static baz() {
console.log('hello');
}
baz() {
console.log('world');
}
}

Foo.bar() // hello
上面代碼中,靜態(tài)方法bar調(diào)用了this.baz,這里的this指的是Foo類,而不是Foo的實(shí)例,等同于調(diào)用Foo.baz。另外,從這個(gè)例子還可以看出,靜態(tài)方法可以與非靜態(tài)方法重名。
父類的靜態(tài)方法,可以被子類繼承。
class Foo {
static classMethod() {
return 'hello';
}
}

class Bar extends Foo {
}

Bar.classMethod() // 'hello'
上面代碼中,父類Foo有一個(gè)靜態(tài)方法,子類Bar可以調(diào)用這個(gè)方法。
靜態(tài)方法也是可以從super對(duì)象上調(diào)用的。
class Foo {
static classMethod() {
return 'hello';
}
}

class Bar extends Foo {
static classMethod() {
return super.classMethod() + ', too';
}
}

Bar.classMethod() // "hello, too"

3、實(shí)例屬性的新寫法

實(shí)例屬性除了定義在constructor()方法里面的this上面,也可以定義在類的最頂層。
class IncreasingCounter {
constructor() {
this._count = 0;
}
get value() {
console.log('Getting the current value!');
return this._count;
}
increment() {
this._count++;
}
}
上面代碼中,實(shí)例屬性this._count定義在constructor()方法里面。另一種寫法是,這個(gè)屬性也可以定義在類的最頂層,其他都不變。
class IncreasingCounter {
_count = 0;
get value() {
console.log('Getting the current value!');
return this._count;
}
increment() {
this._count++;
}
}
上面代碼中,實(shí)例屬性_count與取值函數(shù)value()和increment()方法,處于同一個(gè)層級(jí)。這時(shí),不需要在實(shí)例屬性前面加上this。
這種新寫法的好處是,所有實(shí)例對(duì)象自身的屬性都定義在類的頭部,看上去比較整齊,一眼就能看出這個(gè)類有哪些實(shí)例屬性。
class foo {
bar = 'hello';
baz = 'world';

constructor() {
// ...
}
}
上面的代碼,一眼就能看出,foo類有兩個(gè)實(shí)例屬性,一目了然。另外,寫起來也比較簡(jiǎn)潔。

4、靜態(tài)屬性

靜態(tài)屬性指的是 Class 本身的屬性,即Class.propName,而不是定義在實(shí)例對(duì)象(this)上的屬性。
class Foo {
}

Foo.prop = 1;
Foo.prop // 1
上面的寫法為Foo類定義了一個(gè)靜態(tài)屬性prop。
目前,只有這種寫法可行,因?yàn)?ES6 明確規(guī)定,Class 內(nèi)部只有靜態(tài)方法,沒有靜態(tài)屬性?,F(xiàn)在有一個(gè)提案提供了類的靜態(tài)屬性,寫法是在實(shí)例屬性的前面,加上static關(guān)鍵字。
class MyClass {
static myStaticProp = 42;

constructor() {
console.log(MyClass.myStaticProp); // 42
}
}
這個(gè)新寫法大大方便了靜態(tài)屬性的表達(dá)。
// 老寫法
class Foo {
// ...
}
Foo.prop = 1;

// 新寫法
class Foo {
static prop = 1;
}
上面代碼中,老寫法的靜態(tài)屬性定義在類的外部。整個(gè)類生成以后,再生成靜態(tài)屬性。這樣讓人很容易忽略這個(gè)靜態(tài)屬性,也不符合相關(guān)代碼應(yīng)該放在一起的代碼組織原則。另外,新寫法是顯式聲明(declarative),而不是賦值處理,語義更好。

5、私有方法和私有屬性

現(xiàn)有的解決方案

私有方法和私有屬性,是只能在類的內(nèi)部訪問的方法和屬性,外部不能訪問。這是常見需求,有利于代碼的封裝,但 ES6 不提供,只能通過變通方法模擬實(shí)現(xiàn)。
一種做法是在命名上加以區(qū)別。
class Widget {

// 公有方法
foo (baz) {
this._bar(baz);
}

// 私有方法
_bar(baz) {
return this.snaf = baz;
}

// ...
}
上面代碼中,_bar方法前面的下劃線,表示這是一個(gè)只限于內(nèi)部使用的私有方法。但是,這種命名是不保險(xiǎn)的,在類的外部,還是可以調(diào)用到這個(gè)方法。
另一種方法就是索性將私有方法移出模塊,因?yàn)槟K內(nèi)部的所有方法都是對(duì)外可見的。
class Widget {
foo (baz) {
bar.call(this, baz);
}

// ...
}

function bar(baz) {
return this.snaf = baz;
}
上面代碼中,foo是公開方法,內(nèi)部調(diào)用了bar.call(this, baz)。這使得bar實(shí)際上成為了當(dāng)前模塊的私有方法。
還有一種方法是利用Symbol值的唯一性,將私有方法的名字命名為一個(gè)Symbol值。
const bar = Symbol('bar');
const snaf = Symbol('snaf');

export default class myClass{

// 公有方法
foo(baz) {
this[bar](baz);
}

// 私有方法
[bar](baz) {
return this[snaf] = baz;
}

// ...
};
上面代碼中,bar和snaf都是Symbol值,一般情況下無法獲取到它們,因此達(dá)到了私有方法和私有屬性的效果。但是也不是絕對(duì)不行,Reflect.ownKeys()依然可以拿到它們。
const inst = new myClass();

Reflect.ownKeys(myClass.prototype)
// [ 'constructor', 'foo', Symbol(bar) ]
上面代碼中,Symbol 值的屬性名依然可以從類的外部拿到。

私有屬性的提案

目前,有一個(gè)提案,為class加了私有屬性。方法是在屬性名之前,使用#表示。
class IncreasingCounter {
#count = 0;
get value() {
console.log('Getting the current value!');
return this.#count;
}
increment() {
this.#count++;
}
}
上面代碼中,#count就是私有屬性,只能在類的內(nèi)部使用(this.#count)。如果在類的外部使用,就會(huì)報(bào)錯(cuò)。
const counter = new IncreasingCounter();
counter.#count // 報(bào)錯(cuò)
counter.#count = 42 // 報(bào)錯(cuò)
上面代碼在類的外部,讀取私有屬性,就會(huì)報(bào)錯(cuò)。
下面是另一個(gè)例子。
class Point {
#x;

constructor(x = 0) {
this.#x = +x;
}

get x() {
return this.#x;
}

set x(value) {
this.#x = +value;
}
}
上面代碼中,#x就是私有屬性,在Point類之外是讀取不到這個(gè)屬性的。由于井號(hào)#是屬性名的一部分,使用時(shí)必須帶有#一起使用,所以#x和x是兩個(gè)不同的屬性。
之所以要引入一個(gè)新的前綴#表示私有屬性,而沒有采用private關(guān)鍵字,是因?yàn)?JavaScript 是一門動(dòng)態(tài)語言,沒有類型聲明,使用獨(dú)立的符號(hào)似乎是唯一的比較方便可靠的方法,能夠準(zhǔn)確地區(qū)分一種屬性是否為私有屬性。另外,Ruby 語言使用@表示私有屬性,ES6 沒有用這個(gè)符號(hào)而使用#,是因?yàn)锧已經(jīng)被留給了 Decorator。
這種寫法不僅可以寫私有屬性,還可以用來寫私有方法。
class Foo {
#a;
#b;
constructor(a, b) {
this.#a = a;
this.#b = b;
}
#sum() {
return this.#a + this.#b;
}
printSum() {
console.log(this.#sum());
}
}
上面代碼中,#sum()就是一個(gè)私有方法。
另外,私有屬性也可以設(shè)置 getter 和 setter 方法。
class Counter {
#xValue = 0;

constructor() {
super();
// ...
}

get #x() { return #xValue; }
set #x(value) {
this.#xValue = value;
}
}
上面代碼中,#x是一個(gè)私有屬性,它的讀寫都通過get #x()和set #x()來完成。
私有屬性不限于從this引用,只要是在類的內(nèi)部,實(shí)例也可以引用私有屬性。
class Foo {
#privateValue = 42;
static getPrivateValue(foo) {
return foo.#privateValue;
}
}

Foo.getPrivateValue(new Foo()); // 42
上面代碼允許從實(shí)例foo上面引用私有屬性。
私有屬性和私有方法前面,也可以加上static關(guān)鍵字,表示這是一個(gè)靜態(tài)的私有屬性或私有方法。
class FakeMath {
static PI = 22 / 7;
static #totallyRandomNumber = 4;

static #computeRandomNumber() {
return FakeMath.#totallyRandomNumber;
}

static random() {
console.log('I heard you like random numbers…')
return FakeMath.#computeRandomNumber();
}
}

FakeMath.PI // 3.142857142857143
FakeMath.random()
// I heard you like random numbers…
// 4
FakeMath.#totallyRandomNumber // 報(bào)錯(cuò)
FakeMath.#computeRandomNumber() // 報(bào)錯(cuò)
上面代碼中,#totallyRandomNumber是私有屬性,#computeRandomNumber()是私有方法,只能在FakeMath這個(gè)類的內(nèi)部調(diào)用,外部調(diào)用就會(huì)報(bào)錯(cuò)。

6、new.target 屬性

new是從構(gòu)造函數(shù)生成實(shí)例對(duì)象的命令。ES6 為new命令引入了一個(gè)new.target屬性,該屬性一般用在構(gòu)造函數(shù)之中,返回new命令作用于的那個(gè)構(gòu)造函數(shù)。如果構(gòu)造函數(shù)不是通過new命令或Reflect.construct()調(diào)用的,new.target會(huì)返回undefined,因此這個(gè)屬性可以用來確定構(gòu)造函數(shù)是怎么調(diào)用的。
function Person(name) {
if (new.target !== undefined) {
this.name = name;
} else {
throw new Error('必須使用 new 命令生成實(shí)例');
}
}

// 另一種寫法
function Person(name) {
if (new.target === Person) {
this.name = name;
} else {
throw new Error('必須使用 new 命令生成實(shí)例');
}
}

var person = new Person('張三'); // 正確
var notAPerson = Person.call(person, '張三'); // 報(bào)錯(cuò)
上面代碼確保構(gòu)造函數(shù)只能通過new命令調(diào)用。
Class 內(nèi)部調(diào)用new.target,返回當(dāng)前 Class。
class Rectangle {
constructor(length, width) {
console.log(new.target === Rectangle);
this.length = length;
this.width = width;
}
}

var obj = new Rectangle(3, 4); // 輸出 true
需要注意的是,子類繼承父類時(shí),new.target會(huì)返回子類。
class Rectangle {
constructor(length, width) {
console.log(new.target === Rectangle);
// ...
}
}

class Square extends Rectangle {
constructor(length, width) {
super(length, width);
}
}

var obj = new Square(3); // 輸出 false
上面代碼中,new.target會(huì)返回子類。
利用這個(gè)特點(diǎn),可以寫出不能獨(dú)立使用、必須繼承后才能使用的類。
class Shape {
constructor() {
if (new.target === Shape) {
throw new Error('本類不能實(shí)例化');
}
}
}

class Rectangle extends Shape {
constructor(length, width) {
super();
// ...
}
}

var x = new Shape(); // 報(bào)錯(cuò)
var y = new Rectangle(3, 4); // 正確
上面代碼中,Shape類不能被實(shí)例化,只能用于繼承。
注意,在函數(shù)外部,使用new.target會(huì)報(bào)錯(cuò)。
本節(jié)完~
推薦閱讀
ECMAScript 6 入門教程—Iterator 和 for...of 循環(huán)
ECMAScript 6 入門教程—Promise 對(duì)象
ECMAScript 6 入門教程—Reflect
ECMAScript 6 入門教程—Proxy
ECMAScript 6 入門教程—Set 和 Map 數(shù)據(jù)結(jié)構(gòu)

瀏覽 31
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 一级片黑人| 手机av在线观看| 人人爱人人干人人操| 日韩另类| 97无码视频| 久在线观看| 9l视频自拍蝌蚪9l成人蝌蚪| 开心五月激情网| A片久久久| 日韩精品三区| 99精品视频在线播放免费| 美女白嫩嫩大BBB欣赏| 日韩欧美国产综合| 日韩高潮| 精品国产午夜福利| 亚洲黄色天堂| 乱伦自拍| 射久久| 国产成人AV在线播放| 国产三级片精品| 青青草原在线视频免费观看| 波多野结衣无码AV专区| 黄色视频免费观看| 色欧美大香蕉| 国产精品久久久久久久久| 天天干天天撸| 91精品网站| 91成人在线免费视频| 国产一区二区电影| 97久久精品| 在线免费观看成人视频| 大香蕉色婷婷| 亚洲三级无码视频| 五月天亭亭.com| 日韩群交| 欧美成人网站在线观看| 男女内射视频| 婷婷久久综合久色综| 色婷婷在线视频观看| 韩国精品无码| 天干夜天干天天天爽视频| 中文字幕巨肉乱码中文乱码| 91视频在线观看免费大全| 91人妻人人澡人人爽人人精品一| 色AV网| 精品人妻一区二区三区四区| 九九热毛片在线观看| 97人人艹| 九九热只有精品| 九九九精彩视频| 7777av| 免费视频在线观看一区| 天堂视频中文在线| 亚洲日韩中文字幕在线| 九九福利视频| 大肉大捧一出免费观看| 欧美精品日韩| 青娱乐老视频| 日韩人妻码一区二区三区| 天天日天天操天天摸天天干天日射天天插 | 国产精品成人一区二区| 高潮免费视频| 超碰77| 亚洲专区区免费| 成人精品福利| 视色AV| 久久久久女人精品毛片九一| 91人妻人澡| 久久久久久无码精品亚洲日韩麻豆| 91久久性奴调教| 欧美亚洲成人网站| 加勒比日韩在线| 国产精品欧美综合在线| 欧美国产日韩欧美亚洲国产| 免费看日P视频| 亚洲成人视频在线观看| 黄片视频免费看| 国产激情av| 中文字幕乱码亚洲无线码在线日噜噜| 国产福利91精品一区二区三区| 成人免费a片| 在线观看欧美日韩| 欧美黄片免费观看| 亚洲激情av| 久久嫩草精品久久久久| 日韩av免费在线观看| 免费AV片| 国产又大又粗又长| 成人黄色一级片| 日韩人妻精品无码制服| 国产成人精品三级麻豆| 亚洲一级内射| www国产亚洲精品久久网站| 国产乱码一区二区三区四区在线| 青娱乐自拍视频| 成人视频在线播放| 午夜成人福利电影| 玖玖在线| 免费中文字幕日韩欧美| 国产精品无毛五区六区| 中文字字幕中文字幕乱码| 免费一级婬片AAA片毛片A级 | 91水蜜桃| 黑人内射人妖| 一区二区操逼| 影音先锋AV资源网站| 亚洲小电影在线观看| 亚洲无码一区二区三区蜜桃| 亚洲中文无码在线观看| 久操免费在线观看| 免费人成在线观看视频播放| 亚洲日韩国产成人精品久久| 国产三级免费观看| 强奸乱伦五月天| 乱子伦国产精品www| AAA久久| 无码国产一区二区三区四区五区| www.一区二区| 中文字幕在线精品| 亚洲午夜视频在线观看| 天天综合91| 欧美操| 亚洲精品视频在线观看网站| 日韩大码无码| 亚洲一区黄色| 国内无码视频| 國產精品777777777| 污视频网站在线观看| 中文字幕在线电影| 国产成人ab| 99无码国产成人精品| 亚洲国产精品久久| 女人毛片| 国产91视频| brazzers疯狂作爱| 久久久久久久久成人| 秘蜜桃色一区二区三区在线观看| 成人一区视频| 男人的天堂色婷婷| AV网站免费观看| 黑人大香蕉| 久久成人毛片| 精品人妻一区二区三区日产| 成人影视1-23| 影音av在线| 中日韩精品A片中文字幕| 国产一级二级三级久久久| japanese在线观看| 麻豆一区二区三区四区| 日本欧美在线观看| 国产白丝在线观看| 午夜一区二区三区| 国产人国产视频成人免费观看… | 无码av观看| 夜夜骑免费视频| 人人操97| 国产亚洲欧美视频| 九九九在线视频| 中文字幕2018第一页| 国产精品美女久久久久AV爽| 在线免费观看黄色视频网站| 色综合久久久无码中文字幕999 | 蜜桃av秘无码一区二区| 少妇一区二区三区| 国产一区二区免费看| 热久久视频| 北条麻妃AV观看| 日韩一区二区三| 精品国产精品| 成人在线一区二区| 欧美高清在线综合| 玖玖中文字幕| 无码在线观看免费| 免费视频无码| 91av在线免费观看| 亚洲伦理一区二区| 亚洲成人动漫在线| 久草国产在线视频| 欧美成人高清视频| 久久性爱网| 国产成人久久| 一区无码视频| 亚洲无码免费网站| 日韩偷拍网| 91久久国产综合久| 久久国产免费| 天堂黄片| 少妇人妻一区二区三区| 成人网址大全| 天天日天天干天天干| 91精品久久久久久久| 国产操逼免费看| 成人H视频| 少妇喷水视频| 国产内射无码| 操逼大片| 91N视频| 操BBB操BBB| 成年人在线观看视频网站| 7799精品| 阿宾MD0165麻豆沈娜娜| 思思热在线视频精品| 成人网站www污污污网站公司| jjzz国产| 欧美黄色A片| 五月丁香六月久久| 精品一区二区免费| 久久久人妻熟妇精品无码蜜桃| BBW老熟女BBw| 欧美打炮网| 亚洲欧美日韩在线| 欧美av| 亚洲天堂视频在线| 在线观看黄片| 一区二区三区四区在线视频| 日本精品黄色视频| 国产黄色视频在线免费观看| 青青操逼| 操女人的网站| 日韩人妻丝袜中文字幕| 五月天最新网址| 久久伊人中文字幕| 国产精品人妻无码久久久郑州天气网 | 人妻精品一卡二卡| 香蕉污视频| 国产综合一区二区| 成人网站在线观看视频| 一级黄色电影A片| 免费观看A级毛片| 国产男女无套免费视频| 人人澡人人看| 粉嫩一区二区三区四区| 国产亲子乱婬一级A片借种| 真实野外打野视频| 日日AV| 国产99999| 国产精品视频在线免费观看 | 欧美黄色片| 男女啪网站| 韩日一区二区三区| 西西特级无码444www| 黄色片大香蕉| 成人精品一区日本无码网站suv | 欧美一区二区三区婷婷五月| 国产波霸爆乳一区二区| 伊人综合视频| 久久久性爱视频| 五月天婷婷色播| 亚洲无码色色| 91探花在线观看| 色骚爽大香蕉91| 国产一区二区在线播放| 无码影音| 亚洲综合网站| 国产精品嫩草久久久久yw193| 色婷婷激情视频| 中文字幕视频在线| 成人亚洲精品一区二区三区 | 欧美va| youjizzcom日本| 亚洲婷婷综合网| av资源站| 欧美三级长视频| 另类国产| 无码一区二区视频| 国产熟女一区二区久久| 日本黄色视频在线免费观看| 日产毛片| 国产精品久久久久久久久A| 69欧美视频| V天堂在线| 欧美日p| 青青免费在线视频| 日韩午夜| 久久综合加勒比| 综合网欧美| 黄色精品| 俺来也俺去www色情网| 91人人爱| 精品人妻一区二区三区四区不卡在| 久久久久久大香蕉| 亚洲精品成人7777777| 午夜成人福利视频在线观看| 大伊香蕉久久| 99视频在线播放| 91视频熟女| 在线看91| 日韩综合在线| 日韩三级片在线播放| 无码一区二区视频| 在线观看AV无码| 日本精品黄色| 中文字幕无码AV| 蜜臀久久99久久久久久宅男| 亚洲成人AV在线观看| 2025av中文字幕| 久久天天拍| 黄色免费在线观看视频| 亚洲网站在线免费观看| 少妇搡BBBB搡BBB搡造水多| 老女人操逼| 骚逼久久| 青青草99| 国产成人自拍视频在线| 农村一级婬片A片AAA毛片古装| 人人妻人人澡人人爽久久con| 亚洲精品观看| 精品乱子伦一区二区三区| 老鸭窝久久久| 亚洲色小说| 成人性爱福利视频| 久久久久99精品成人片三人毛片| 中文字幕视频在线| 欧美日韩肏屄视频| 熟妇人妻中文AV| 你懂的在线视频观看| 三级午夜在线无码| 国产福利视频| 看免费黄色视频| 天天天天天天干| 久久久久女人精品毛片九一| 黑人一级| 久色婷婷在线| 中文字幕天天干| 中国一级黄色A片| 精品蜜桃秘一区二区三区在线播放| 大香蕉久| 亚洲高清电影| 操逼动漫| 日本豆花视频| 波多野成人无码精品69| 91女色| 狼友无码| 欧美操日本| A片免费在线播放| 色老板在线视频| AA片视频| 麻豆91免费看| 操逼操逼视频| 青草中文娱乐网在线| 国产成人TV| 国产第二页| 亚洲欧美另类色图| 国产亚洲久一区二区^_^| 美女高潮在线| 91在线无码精品秘入口动作| 丁香五月成人网| h片免费观看| 伊人色色色| 特级西西44www无码| 蜜桃传媒AV| 性日韩| 日韩无码黄色电影| 激情五月天色| 日本少妇中文字幕| 中文字幕亚洲一区| 艹逼中文字幕| 加勒比无码| 欧美日韩V| 色色五月天婷婷| 亚洲视频在线观| 午夜精品18视频国产17c | 国产综合亚洲精品一区二| 日批视频在线观看| 夜夜爽夜夜高潮夜夜爽| 国产av毛片| 开心色播五月天| 精品国产一区二区三区久久久蜜月| zzjicom| 麻豆视频在线| 91AV天天在线观看| 人人操夜夜操| 国产伦精品一级A片视频夜夜 | 午夜精品18视频国产17c| 九七人妻| 丁香视频| 18禁一区| 久草中文在线视频| 国产在线观看av| 欧美一区二区三区在线播放| 国产在线小电影| 阿v视频在线观看| 黄色精品视频| 伊人99re| 日本老妇操屄视频| 福利在线| 99热精品久久| 免费在线看a| 波多野结衣在线无码视频| 免费无码高清视频| 人人天天爽| 日韩在线| 中文无码日本一级A片人| 男女性爱视频免费| 精品久久精品| 美女被操面费网站| 色欲av在线| 青青草伊人大香蕉| 怡春院中文字幕| 99re免费视频| 成人一区二区在线| 亚洲无码精品在线| 亚洲色图五月天| 男女爱爱动态图| 亚洲一区欧美| 成人无码小电影| 天天看天天日| 97成人精品| 男女av| 亚洲操色| 久草视频在线资源| 精品国产一区二区三区久久久蜜月| 91成人电影院| 黑人AV在线| 一级特黄色片| 中文免费高清在线观看视频| 无码窝在线观看| 大香蕉伊人网视频| 蜜桃久久99精品久久久酒店 | 中文字幕不卡视频| 台湾AV在线| 97人人插| 国产草莓视频| 欧美亚洲色色网视频| 麻豆内射| 三级片AV在线| 影音先锋一区二区三区| 成人综合网站| 人妻无码在线观看| 99精品视频在线播放免费| 精品国内自产拍在线观看视频 | 天天干天天插| 福利在线| 欧美熟妇擦BBBB擦BBBB| 性爱视频网址| 国产第56页| 蝌蚪窝免费在线视频| 九九热在线观看| 天天干天天射天天爽| 色狠狠网| 成人国产精品视频| 一级a片免费| www.色999| 国产又爽又黄在线看| 蜜桃影院| 神马午夜福利| 国产真实露脸乱子伦对白高清视频 | 无码人妻一区二区三区蜜桃视频 | 欧美精产国品一二三区别电影| 波多野结衣无码一区二区| 国产免费AV片在线无码| 色婷婷激情AV| 熟妇在线| 久久久精品淫秽色情| 无码不卡视频| 色综合天天综合| 国产欧美综合三级伦| 欧美一区二区三区在线| 日韩精品免费观看| 国产精品美女久久久| 国产日韩欧美| 天天干天天日天天色| 欧美精品黄| 性感成人在线| 国产成人亚洲综合A∨婷婷| 91国产精品在线| 999成人电影| 中国操逼视频| 91成人在线电影| 69视频在线观看免费| 成人香蕉网| 国产91精品久久久天天| 亚洲色伦| 午夜乱伦| 国产精品成人无码a无码| 黄色免费av| 亚洲精品色色| 日本久久电影| 日本中文字幕不卡| 成人久久久久久| 操逼无码| 一级片免费视频| 26uuu国产| 久久A视频| 国产传媒在线观看| 国产麻豆性爱视频| 超碰人人人人人人人人| 欧美激情四射老司机| 日韩高清av| 蜜桃av无码一区三区| 亚洲国产成人精品午夜| 午夜福利院| 淫色五月| 国产香蕉视频在线播放| 精品少妇视频| 最近中文字幕免费| 一起草在线视频| 99热这里只有精品999| 一级片在线播放| 丰满老妇高潮一级A片| 久久久久久久伊人| 精品色片| 日韩三级视频| 欧美一级黃色A片免费看小优视频| aaa成人| 日韩最新无码发布| 婷婷激情五月| 婷婷丁香激情| 性无码一区二区三区在线观看| 免费爱爱视频网站| 一区二区操逼| 日韩无码网址| 北条麻妃被躁57分钟视频在线 | 在线免费观看av网站| 中文字幕高清免费看| 性爱视频网站| 久久婷婷网| 蜜臀久久精品久久久久| 久久av一区| 伊人中文字幕| 亚洲视频免费完整版在线播放| 99色在线视频| 波多野结衣在线无码视频| 抠骚逼| 清清草视频| 欧美午夜精品成人片在线播放 | 亚洲午夜成人精品一区二区 | AV第一福利大全导航| 亚洲欧洲在线播放| 一级黄色A片| 91探花国产综合在线精品| 日韩天堂网| 天天操欧美| 色色色色网| 日本欧美在线观看高清| 水果派解说在线观看| 精品国产欧美一区二区三区成人| 日本韩国高清无码| 午夜无码福利视频| 国产亚洲视频在线观看视频| 中文字幕二区| 中文三级片| 无码欧洲| 俄罗斯老熟妇与子伦| 尤物av在线| 九九99电影| 亚洲视频一区二区| 第一福利成人AV导航| 九九天堂| 国产成人自拍网| wwwxx在线观看| 高清无码免费视频| 伊人东京热| 狠狠干2021| 亚洲免费观看高清完整版在线观| 性爱视频99| 国产特黄级AAAAA片免| 国产免费视频69| 碰碰视频| 亚洲成人福利| 一区二区无码区| 日本69视频| 亚洲日韩精品成人无码专区AV| 亚洲高清无码免费在线观看| 山东熟妇搡BBBB搡BBBB| 91免费小视频| 97自拍| 精品孕妇一区二区三区| 国产口爆视频| 四虎亚洲| 久久A√一区二区| 亚洲韩国中文字幕| 激情视频网址| 婷婷五月在线观看| 蜜桃av一区二区三区| 二区不卡| jt33免费观看高清| 亚洲视频观看| 激情乱伦网站| 国产婷婷色一区二区| 精品久久视频| 欧美一级一级| 国产色哟哟| 日韩中文无| 亚洲日韩欧美中在线| 亚洲天天在线| 天天射中文| 老司机午夜电影| 天天爽夜夜爽精品成人免费| 国产三级电影| 日韩一区二区视频| 99这里只有精品视频| 国产精品av在线| 色先锋av| 青娱乐成人在线| 日本a在线免费观看| 一级二级三级毛片| 久久久久亚洲AV无码专区成人| 国产福利网站| 无码精品视频在线观看| 四色永久成人网站| 国产A片网站| BBw日本熟妇BBwHD| 蜜桃91在线| 手机看片1024久久| 欧美在线观看视频一区| 丝瓜视频污APP| 黄色免费网站| 久久婷婷秘精品国产538| 91亚洲视频在线观看| 97人妻一区二区三区| 18禁网站免费| 日韩性做爰免费A片AA片| 高清无码日本| 乱伦视频91| 欧美日韩第一区| 无码AV电影在线观看| 国产一级AA片| 91在线无码精品秘软件| 中国女人如毛片| 午夜成人亚洲| 俺来也官网欧美久久精品| 超碰91在线| 国产无码免费视频| 久草手机在线| 午夜高清无码| 日韩有码第一页| 97一区二区三区| 性满足BBWBBWBBW| 国产av一级片| ppypp电影频道| 中文字幕一区在线| 波多野结衣视频一区| 亚洲天堂高清| 久久精品视频9| 三级无码片| 老湿机福利院| 四虎看片| 精品免费在线| 日韩无码高清免费| 精品久久无码| 国产精品自拍在线观看| 亚洲一二三四区| 婷婷丁香五月网| 国产免费观看AV| 特一级黄色| 中文免费高清在线| 成人网站一区二区| 波多野结衣av一区| 男女午夜| 午夜久久福利| 水多多成人视频| 色老板综合| 中文字幕成| 天天艹天天| 无码av高清| 国产精品卡一| 国产精品一区二区免费| 吃奶做爱视频| 操逼123首页| av不卡在线观看| 成人福利电影| 日本韩国欧美18| 中文字幕少妇| 亚洲黄色免费观看| 欧美成人看片黄a免费看| 欧美日韩在线视频免费观看| 人人看人人摸人人草| 中文字幕高清无码在线| 97超碰资源总站| 环亚无码| 婷婷五月天基地| 亚洲va欧洲va国产va不卡| 无码秘人妻一区二区三-百度| 在线看国产| 午夜无码人妻AV大片| 欧美一级黄色A片| 中文字幕在线观| 日本黄色视频在线播放| 欧美三级视频在线观看| 天天爽天天干| 在线免费看黄片| av资源在线| 68久久久| 亚洲精品成人av| 青娱乐亚洲精品视频| 国产污视频| 五香丁香天堂网| 色九九视频| 国产黄色Av| 亚洲AV成人片色在线观看高潮| 操B影院| 欧美四虎| 环亚无码| 天天草天天干| 北条麻妃日B视频| 婷婷在线综合| 欧美激情综合色综合啪啪五月 | 亚洲免费在线播放| 亚洲无码在| 国内精品国产成人国产三级| 九九热毛片在线观看| 亚洲国产一区二区三区四区| 国产精品免费麻豆| 16一17女人毛片| 九九99精品视频| 日韩美女久久| 51AV在线| 日逼欧美| 日本精品无码a62v在线| 国产精品综合激情| 91色色色| 成人毛片网站| 精品國產一區二區三區久久蜜月| 天天夜夜爽| 亚洲欧洲久久| 国产精品中文字幕在线观看| 久草视频在线免费看| 日韩免费小视频| 337P人体美鮑高清| 十八禁无码网站在线观看| 成人做爰100部免费网站| 操逼视频免费在线观看| 人成视频在线观看| 九九99电影| 天天天天天天天天干| 99插插插| 国产成人精品免高潮在线观看| 国产乱伦毛片| 黄色视频在线观看免费网站| 国产乱子伦视频国产印度| 欧美成人大香蕉| 亚洲成人高清| AV天堂影视在线观看| 91九色精品女同系列| 丁香婷婷网| 成人精品免费无码毛片| 欧美色图综合| 亚洲免费黄色电影| 国产传媒自拍| 伊人网站| 丰满人妻一区二区三区Av猛交| 豆花成人网站在线看| 爱就色色网| 伊人久久香| 日本黄色视频网址| 麻豆免费成人传媒| 狠狠干狠狠操| 成人免费无码A片免费| 男人的天堂视频在线| 成人电影综合网| 99人妻在线| 91超碰在线免费观看| 免费黄片视频| 免费看毛片中文字幕| 好爽~要尿了~要喷了~同桌| 亚洲成人a| 校园春色亚洲无码| 99人人操| 亚洲日韩中文字幕在线| 搡BBB搡BBBB搡BBBB| 996热久久| 亚洲视频天天射| 亚洲网站免费观看| 91人妻人人澡人人澡人人精品| 国产欧美精品一区二区| 一区二区亚洲| 丝袜东京热AV高清| 97婷婷五月天| 91AV在线电影| 黄片一区二区三区| 精品免费国产一区二区三区四区的使用方法| 天堂无码| 久久艹精品视频| 日韩久久精品视频| 亚洲AV无码国产综合专区| 最近2021中文字幕免费| 中文字幕AV在线播放| 99久久综合九九| 天堂视频在线观看亚洲美女| 91丨PORNY丨对白| www天天干| 欧美日韩国产精品| 波多野结衣av在线观看窜天猴| 日韩一区二区视频在线观看| 欧美成人大片| 无码一道本一区二区无码| 日韩视频第一页| 亚洲第一香蕉视频| 蜜桃久久久亚洲| 最新中文字幕在线观看视频| 黄色一级a片| 1级毛片| 黄色视频在线观看亚洲一区二区三区免费 | 狼友在线观看| 香蕉成人网| 中文成人在线| 欧美性猛交XXXXⅩXX| 十八禁无码网站在线观看| 国产成人AV在线| 女人自慰在线观看| 国产精品美女久久久| 国产女人18毛片水18精品| 亚洲天天| 日韩无码一区二区三区| 日B视频网站| 欧美人操逼视频| 水蜜桃91| 99性爱视频| 国产性受XXXXXYX性爽| 日韩成人三级片| 人人澡人人添人人爽人人| 四虎永久www成人影院| 性满足BBwBBWBBw| 国内精品久久久久久久久98| 色婷婷日韩精品一区二区三区 | 欧美激情五月天| 中国一级黄色A片| 人人妻日日摸狠狠躁视频| 日本无码在线视频| 99在线视频免费观看| 国产在线观看欧美| 国产精品一区二区在线播放| 婷婷天堂网| 亚洲高清在线播放| 日韩视频三区| 色老板综合| 成人小说一区二区三区| 天天干视频| 久久久精品国产视频| 成人黄色电影在线| 大香蕉伊人在线观看视频| 激情一区| 日韩乱伦网站| 免费在线观看黄色片| 丰满欧美熟妇免费视频| 久久久999精品视频| 99er在线观看| 日本AⅤ在线观看| 日韩无码视频一区| 久碰人妻人妻人妻| 69式荫蒂被添全过程| 噜噜色色噜噜| 韩国三级中文字幕HD久久精品| 九七AV| av怡红院| 亚洲在线免费观看| 女邻居的B好大| 国产口爆在线观看| 天天操天天拍| 亚洲精品无码在线播放| 欧美三p| 人人草在线视频| 亚洲精品一区无码A片丁香花| 大香蕉伊人色| 一区二区国产精品| 亚洲一级电影| 亚洲天堂无码av| 日韩激情AV| 免费AV在线| 777米奇视频| 中文字幕永久在线观看| 亚洲无码偷拍| 操逼网123首页| 成人久久久久一级大黄毛片中国 | 国产一级性爱视频| 国产精品色在线| 日韩一级免费毛片| 久久99久久视频| 色婷婷久久综合| 国产成人精品三级麻豆| 亚日韩视频| 久操99| 蜜桃Av噜噜一区二区| 亚洲AV无码成人精品区东京热 | 久久久久久无码日韩欧美电影 | 中文字幕乱码中文乱码图片| 欧美亚洲日韩一区二区三区| 欧美性爱视频网站| 天堂网2018| 亚洲无码一级片| 一级黄色大毛片| 天天色粽合合合合合合合| 免费婷婷| 亚洲福利一区二区| 精品人妻一区二区三区阅读全文| 欧美手机在线视频| 久久久www成人免费毛片| 中文字幕日本精品5| 老女人的逼| 午夜亚洲视频| 婷婷五月天网| 操逼无码| 欧洲三级网观看| 人人操人人干人人摸| 日本久久精品| 成人久久av| 99视频网站| 97伊人大香蕉| 国产色哟哟|