久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

深入理解JavaScript系列(18):面向对象编程之ECMAScript实现

發(fā)布時(shí)間:2024/4/15 javascript 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

http://www.cnblogs.com/TomXu/archive/2012/02/06/2330609.html

介紹

本章是關(guān)于ECMAScript面向?qū)ο髮?shí)現(xiàn)的第2篇,第1篇我們討論的是概論和CEMAScript的比較,如果你還沒有讀第1篇,在進(jìn)行本章之前,我強(qiáng)烈建議你先讀一下第1篇,因?yàn)楸酒獙?shí)在太長了(35頁)。

英文原文:http://dmitrysoshnikov.com/ecmascript/chapter-7-2-oop-ecmascript-implementation/

注:由于篇幅太長了,難免出現(xiàn)錯(cuò)誤,時(shí)刻保持修正中。

在概論里,我們延伸到了ECMAScript,現(xiàn)在,當(dāng)我們知道它OOP實(shí)現(xiàn)時(shí),我們再來準(zhǔn)確定義一下:

ECMAScript is an object-oriented programming language supporting delegating inheritance based on prototypes. ECMAScript是一種面向?qū)ο笳Z言,支持基于原型的委托式繼承。

我們將從最基本的數(shù)據(jù)類型來分析,首先要了解的是ECMAScript用原始值(primitive values)和對象(objects)來區(qū)分實(shí)體,因此有些文章里說的“在JavaScript里,一切都是對象”是錯(cuò)誤的(不完全對),原始值就是我們這里要討論的一些數(shù)據(jù)類型。

數(shù)據(jù)類型

雖然ECMAScript是可以動(dòng)態(tài)轉(zhuǎn)化類型的動(dòng)態(tài)弱類型語言,它還是有數(shù)據(jù)類型的。也就是說,一個(gè)對象要屬于一個(gè)實(shí)實(shí)在在的類型。 標(biāo)準(zhǔn)規(guī)范里定義了9種數(shù)據(jù)類型,但只有6種是在ECMAScript程序里可以直接訪問的,它們是:Undefined、Null、Boolean、String、Number、Object。

另外3種類型只能在實(shí)現(xiàn)級別訪問(ECMAScript對象是不能使用這些類型的)并用于規(guī)范來解釋一些操作行為、保存中間值。這3種類型是:Reference、List和Completion。

因此,Reference是用來解釋delete、typeof、this這樣的操作符,并且包含一個(gè)基對象和一個(gè)屬性名稱;List描述的是參數(shù)列表的行為(在new表達(dá)式和函數(shù)調(diào)用的時(shí)候);Completion是用來解釋行為break、continue、return和throw語句的。

原始值類型

回頭來看6中用于ECMAScript程序的數(shù)據(jù)類型,前5種是原始值類型,包括Undefined、Null、Boolean、String、Number、Object。 原始值類型例子:

var a = undefined; var b = null; var c = true; var d = 'test'; var e = 10;

這些值是在底層上直接實(shí)現(xiàn)的,他們不是object,所以沒有原型,沒有構(gòu)造函數(shù)。

大叔注:這些原生值和我們平時(shí)用的(Boolean、String、Number、Object)雖然名字上相似,但不是同一個(gè)東西。所以typeof(true)和typeof(Boolean)結(jié)果是不一樣的,因?yàn)閠ypeof(Boolean)的結(jié)果是function,所以函數(shù)Boolean、String、Number是有原型的(下面的讀寫屬性章節(jié)也會(huì)提到)。

想知道數(shù)據(jù)是哪種類型用typeof是最好不過了,有個(gè)例子需要注意一下,如果用typeof來判斷null的類型,結(jié)果是object,為什么呢?因?yàn)閚ull的類型是定義為Null的。

alert(typeof null); // "object"

顯示"object"原因是因?yàn)橐?guī)范就是這么規(guī)定的:對于Null值的typeof字符串值返回"object“。

規(guī)范沒有想象解釋這個(gè),但是Brendan Eich (JavaScript發(fā)明人)注意到null相對于undefined大多數(shù)都是用于對象出現(xiàn)的地方,例如設(shè)置一個(gè)對象為空引用。但是有些文檔里有些氣人將之歸結(jié)為bug,而且將該bug放在Brendan Eich也參與討論的bug列表里,結(jié)果就是任其自然,還是把typeof null的結(jié)果設(shè)置為object(盡管262-3的標(biāo)準(zhǔn)是定義null的類型是Null,262-5已經(jīng)將標(biāo)準(zhǔn)修改為null的類型是object了)。

Object類型

接著,Object類型(不要和Object構(gòu)造函數(shù)混淆了,現(xiàn)在只討論抽象類型)是描述 ECMAScript對象的唯一一個(gè)數(shù)據(jù)類型。

Object is an unordered collection of key-value pairs. 對象是一個(gè)包含key-value對的無序集合

對象的key值被稱為屬性,屬性是原始值和其他對象的容器。如果屬性的值是函數(shù)我們稱它為方法 。

例如:

var x = { // 對象"x"有3個(gè)屬性: a, b, c a: 10, // 原始值 b: {z: 100}, // 對象"b"有一個(gè)屬性z c: function () { // 函數(shù)(方法) alert('method x.c'); } }; alert(x.a); // 10alert(x.b); // [object Object]alert(x.b.z); // 100x.c(); // 'method x.c'

動(dòng)態(tài)性

正如我們在第17章中指出的,ES中的對象是完全動(dòng)態(tài)的。這意味著,在程序執(zhí)行的時(shí)候我們可以任意地添加,修改或刪除對象的屬性。

例如:

var foo = {x: 10}; // 添加新屬性foo.y = 20; console.log(foo); // {x: 10, y: 20} // 將屬性值修改為函數(shù)foo.x = function () { console.log('foo.x'); }; foo.x(); // 'foo.x' // 刪除屬性delete foo.x; console.log(foo); // {y: 20}

有些屬性不能被修改——(只讀屬性、已刪除屬性或不可配置的屬性)。 我們將稍后在屬性特性里講解。

另外,ES5規(guī)范規(guī)定,靜態(tài)對象不能擴(kuò)展新的屬性,并且它的屬性頁不能刪除或者修改。他們是所謂的凍結(jié)對象,可以通過應(yīng)用Object.freeze(o)方法得到。

var foo = {x: 10}; // 凍結(jié)對象Object.freeze(foo); console.log(Object.isFrozen(foo)); // true // 不能修改foo.x = 100; // 不能擴(kuò)展foo.y = 200; // 不能刪除delete foo.x; console.log(foo); // {x: 10}

在ES5規(guī)范里,也使用Object.preventExtensions(o)方法防止擴(kuò)展,或者使用Object.defineProperty(o)方法來定義屬性:

var foo = {x : 10}; Object.defineProperty(foo, "y", { value: 20, writable: false, // 只讀 configurable: false // 不可配置}); // 不能修改foo.y = 200; // 不能刪除delete foo.y; // false // 防治擴(kuò)展Object.preventExtensions(foo); console.log(Object.isExtensible(foo)); // false // 不能添加新屬性foo.z = 30; console.log(foo); {x: 10, y: 20}

內(nèi)置對象、原生對象及宿主對象

有必要需要注意的是規(guī)范還區(qū)分了這內(nèi)置對象、元素對象和宿主對象。

內(nèi)置對象和元素對象是被ECMAScript規(guī)范定義和實(shí)現(xiàn)的,兩者之間的差異微不足道。所有ECMAScript實(shí)現(xiàn)的對象都是原生對象(其中一些是內(nèi)置對象、一些在程序執(zhí)行的時(shí)候創(chuàng)建,例如用戶自定義對象)。內(nèi)置對象是原生對象的一個(gè)子集、是在程序開始之前內(nèi)置到ECMAScript里的(例如,parseInt, Match等)。所有的宿主對象是由宿主環(huán)境提供的,通常是瀏覽器,并可能包括如window、alert等。

注意,宿主對象可能是ES自身實(shí)現(xiàn)的,完全符合規(guī)范的語義。從這點(diǎn)來說,他們能稱為“原生宿主”對象(盡快很理論),不過規(guī)范沒有定義“原生宿主”對象的概念。

Boolean,String和Number對象

另外,規(guī)范也定義了一些原生的特殊包裝類,這些對象是:

  • 布爾對象
  • 字符串對象
  • 數(shù)字對象
  • 這些對象的創(chuàng)建,是通過相應(yīng)的內(nèi)置構(gòu)造器創(chuàng)建,并且包含原生值作為其內(nèi)部屬性,這些對象可以轉(zhuǎn)換省原始值,反之亦然。

    var c = new Boolean(true); var d = new String('test'); var e = new Number(10); // 轉(zhuǎn)換成原始值 // 使用不帶new關(guān)鍵字的函數(shù)с = Boolean(c); d = String(d); e = Number(e); // 重新轉(zhuǎn)換成對象с = Object(c); d = Object(d); e = Object(e);

    此外,也有對象是由特殊的內(nèi)置構(gòu)造函數(shù)創(chuàng)建: Function(函數(shù)對象構(gòu)造器)、Array(數(shù)組構(gòu)造器) RegExp(正則表達(dá)式構(gòu)造器)、Math(數(shù)學(xué)模塊)、 Date(日期的構(gòu)造器)等等,這些對象也是Object對象類型的值,他們彼此的區(qū)別是由內(nèi)部屬性管理的,我們在下面討論這些內(nèi)容。

    字面量Literal

    對于三個(gè)對象的值:對象(object),數(shù)組(array)和正則表達(dá)式(regular expression),他們分別有簡寫的標(biāo)示符稱為:對象初始化器、數(shù)組初始化器、和正則表達(dá)式初始化器:

    // 等價(jià)于new Array(1, 2, 3); // 或者array = new Array(); // array[0] = 1; // array[1] = 2; // array[2] = 3;var array = [1, 2, 3]; // 等價(jià)于 // var object = new Object(); // object.a = 1; // object.b = 2; // object.c = 3;var object = {a: 1, b: 2, c: 3}; // 等價(jià)于new RegExp("^\\d+$", "g")var re = /^\d+$/g;

    注意,如果上述三個(gè)對象進(jìn)行重新賦值名稱到新的類型上的話,那隨后的實(shí)現(xiàn)語義就是按照新賦值的類型來使用,例如在當(dāng)前的Rhino和老版本SpiderMonkey 1.7的實(shí)現(xiàn)上,會(huì)成功以new關(guān)鍵字的構(gòu)造器來創(chuàng)建對象,但有些實(shí)現(xiàn)(當(dāng)前Spider/TraceMonkey)字面量的語義在類型改變以后卻不一定改變。

    var getClass = Object.prototype.toString; Object = Number; var foo = new Object; alert([foo, getClass.call(foo)]); // 0, "[object Number]" var bar = {}; // Rhino, SpiderMonkey 1.7中 - 0, "[object Number]" // 其它: still "[object Object]", "[object Object]"alert([bar, getClass.call(bar)]); // Array也是一樣的效果Array = Number; foo = new Array; alert([foo, getClass.call(foo)]); // 0, "[object Number]" bar = []; // Rhino, SpiderMonkey 1.7中 - 0, "[object Number]" // 其它: still "", "[object Object]"alert([bar, getClass.call(bar)]); // 但對RegExp,字面量的語義是不被改變的。 semantics of the literal // isn't being changed in all tested implementations RegExp = Number; foo = new RegExp; alert([foo, getClass.call(foo)]); // 0, "[object Number]" bar = /(?!)/g; alert([bar, getClass.call(bar)]); // /(?!)/g, "[object RegExp]"

    正則表達(dá)式字面量和RegExp對象

    注意,下面2個(gè)例子在第三版的規(guī)范里,正則表達(dá)式的語義都是等價(jià)的,regexp字面量只在一句里存在,并且再解析階段創(chuàng)建,但RegExp構(gòu)造器創(chuàng)建的卻是新對象,所以這可能會(huì)導(dǎo)致出一些問題,如lastIndex的值在測試的時(shí)候結(jié)果是錯(cuò)誤的:

    for (var k = 0; k < 4; k++) { var re = /ecma/g; alert(re.lastIndex); // 0, 4, 0, 4 alert(re.test("ecmascript")); // true, false, true, false} // 對比 for (var k = 0; k < 4; k++) { var re = new RegExp("ecma", "g"); alert(re.lastIndex); // 0, 0, 0, 0 alert(re.test("ecmascript")); // true, true, true, true}

    注:不過這些問題在第5版的ES規(guī)范都已經(jīng)修正了,不管是基于字面量的還是構(gòu)造器的,正則都是創(chuàng)建新對象

    關(guān)聯(lián)數(shù)組

    各種文字靜態(tài)討論,JavaScript對象(經(jīng)常是用對象初始化器{}來創(chuàng)建)被稱為哈希表哈希表或其它簡單的稱謂:哈希(Ruby或Perl里的概念), 管理數(shù)組(PHP里的概念),詞典 (Python里的概念)等。

    只有這樣的術(shù)語,主要是因?yàn)樗麄兊慕Y(jié)構(gòu)都是相似的,就是使用“鍵-值”對來存儲對象,完全符合“關(guān)聯(lián)數(shù)組 ”或“哈希表 ”理論定義的數(shù)據(jù)結(jié)構(gòu)。 此外,哈希表抽象數(shù)據(jù)類型通常是在實(shí)現(xiàn)層面使用。

    但是,盡管術(shù)語上來描述這個(gè)概念,但實(shí)際上這個(gè)是錯(cuò)誤,從ECMAScript來看:ECMAScript只有一個(gè)對象以及類型以及它的子類型,這和“鍵-值”對存儲沒有什么區(qū)別,因此在這上面沒有特別的概念。 因?yàn)槿魏螌ο蟮膬?nèi)部屬性都可以存儲為鍵-值”對:

    var a = {x: 10}; a['y'] = 20; a.z = 30; var b = new Number(1); b.x = 10; b.y = 20; b['z'] = 30; var c = new Function(''); c.x = 10; c.y = 20; c['z'] = 30; // 等等,任意對象的子類型"subtype"

    此外,由于在ECMAScript中對象可以是空的,所以"hash"的概念在這里也是不正確的:

    Object.prototype.x = 10; var a = {}; // 創(chuàng)建空"hash" alert(a["x"]); // 10, 但不為空alert(a.toString); // function a["y"] = 20; // 添加新的鍵值對到 "hash"alert(a["y"]); // 20 Object.prototype.y = 20; // 添加原型屬性 delete a["y"]; // 刪除alert(a["y"]); // 但這里key和value依然有值 – 20

    請注意, ES5標(biāo)準(zhǔn)可以讓我們創(chuàng)建沒原型的對象(使用Object.create(null)方法實(shí)現(xiàn))對,從這個(gè)角度來說,這樣的對象可以稱之為哈希表:

    var aHashTable = Object.create(null); console.log(aHashTable.toString); // 未定義

    此外,一些屬性有特定的getter / setter方法,所以也可能導(dǎo)致混淆這個(gè)概念:

    var a = new String("foo"); a['length'] = 10; alert(a['length']); // 3

    然而,即使認(rèn)為“哈希”可能有一個(gè)“原型”(例如,在Ruby或Python里委托哈希對象的類),在ECMAScript里,這個(gè)術(shù)語也是不對的,因?yàn)?個(gè)表示法之間沒有語義上的區(qū)別(即用點(diǎn)表示法a.b和a["b"]表示法)。

    在ECMAScript中的“property屬性”的概念語義上和"key"、數(shù)組索引、方法沒有分開的,這里所有對象的屬性讀寫都要遵循統(tǒng)一的規(guī)則:檢查原型鏈。

    在下面Ruby的例子中,我們可以看到語義上的區(qū)別:

    a = {} a.class # Hash a.length # 0 # new "key-value" paira['length'] = 10; # 語義上,用點(diǎn)訪問的是屬性或方法,而不是key a.length # 1 # 而索引器訪問訪問的是hash里的key a['length'] # 10 # 就類似于在現(xiàn)有對象上動(dòng)態(tài)聲明Hash類 # 然后聲明新屬性或方法 class Hash def z 100 end end # 新屬性可以訪問 a.z # 100 # 但不是"key" a['z'] # nil

    ECMA-262-3標(biāo)準(zhǔn)并沒有定義“哈希”(以及類似)的概念。但是,有這樣的結(jié)構(gòu)理論的話,那可能以此命名的對象。

    對象轉(zhuǎn)換

    將對象轉(zhuǎn)化成原始值可以用valueOf方法,正如我們所說的,當(dāng)函數(shù)的構(gòu)造函數(shù)調(diào)用做為function(對于某些類型的),但如果不用new關(guān)鍵字就是將對象轉(zhuǎn)化成原始值,就相當(dāng)于隱式的valueOf方法調(diào)用:

    var a = new Number(1); var primitiveA = Number(a); // 隱式"valueOf"調(diào)用var alsoPrimitiveA = a.valueOf(); // 顯式調(diào)用 alert([ typeof a, // "object" typeof primitiveA, // "number" typeof alsoPrimitiveA // "number"]);

    這種方式允許對象參與各種操作,例如:

    var a = new Number(1); var b = new Number(2); alert(a + b); // 3 // 甚至 var c = { x: 10, y: 20, valueOf: function () { return this.x + this.y; } }; var d = { x: 30, y: 40, // 和c的valueOf功能一樣 valueOf: c.valueOf }; alert(c + d); // 100

    valueOf的默認(rèn)值會(huì)根據(jù)根據(jù)對象的類型改變(如果不被覆蓋的話),對某些對象,他返回的是this——例如:Object.prototype.valueOf(),還有計(jì)算型的值:Date.prototype.valueOf()返回的是日期時(shí)間:

    var a = {}; alert(a.valueOf() === a); // true, "valueOf"返回this var d = new Date(); alert(d.valueOf()); // timealert(d.valueOf() === d.getTime()); // true

    此外,對象還有一個(gè)更原始的代表性——字符串展示。 這個(gè)toString方法是可靠的,它在某些操作上是自動(dòng)使用的:

    var a = { valueOf: function () { return 100; }, toString: function () { return '__test'; } }; // 這個(gè)操作里,toString方法自動(dòng)調(diào)用alert(a); // "__test" // 但是這里,調(diào)用的卻是valueOf()方法alert(a + 10); // 110 // 但,一旦valueOf刪除以后 // toString又可以自動(dòng)調(diào)用了delete a.valueOf; alert(a + 10); // "_test10"

    Object.prototype上定義的toString方法具有特殊意義,它返回的我們下面將要討論的內(nèi)部[[Class]]屬性值。

    和轉(zhuǎn)化成原始值(ToPrimitive)相比,將值轉(zhuǎn)化成對象類型也有一個(gè)轉(zhuǎn)化規(guī)范(ToObject)。

    一個(gè)顯式方法是使用內(nèi)置的Object構(gòu)造函數(shù)作為function來調(diào)用ToObject(有些類似通過new關(guān)鍵字也可以):

    var n = Object(1); // [object Number]var s = Object('test'); // [object String] // 一些類似,使用new操作符也可以var b = new Object(true); // [object Boolean] // 應(yīng)用參數(shù)new Object的話創(chuàng)建的是簡單對象var o = new Object(); // [object Object] // 如果參數(shù)是一個(gè)現(xiàn)有的對象 // 那創(chuàng)建的結(jié)果就是簡單返回該對象var a = []; alert(a === new Object(a)); // truealert(a === Object(a)); // true

    關(guān)于調(diào)用內(nèi)置構(gòu)造函數(shù),使用還是不適用new操作符沒有通用規(guī)則,取決于構(gòu)造函數(shù)。 例如Array或Function當(dāng)使用new操作符的構(gòu)造函數(shù)或者不使用new操作符的簡單函數(shù)使用產(chǎn)生相同的結(jié)果的:

    var a = Array(1, 2, 3); // [object Array]var b = new Array(1, 2, 3); // [object Array]var c = [1, 2, 3]; // [object Array] var d = Function(''); // [object Function]var e = new Function(''); // [object Function]

    有些操作符使用的時(shí)候,也有一些顯示和隱式轉(zhuǎn)化:

    var a = 1; var b = 2; // 隱式var c = a + b; // 3, numbervar d = a + b + '5' // "35", string // 顯式var e = '10'; // "10", stringvar f = +e; // 10, numbervar g = parseInt(e, 10); // 10, number // 等等

    屬性的特性

    所有的屬性(property) 都可以有很多特性(attributes)。

  • {ReadOnly}——忽略向?qū)傩再x值的寫操作嘗,但只讀屬性可以由宿主環(huán)境行為改變——也就是說不是“恒定值” ;
  • {DontEnum}——屬性不能被for..in循環(huán)枚舉
  • {DontDelete}——糊了delete操作符的行為被忽略(即刪不掉);
  • {Internal}——內(nèi)部屬性,沒有名字(僅在實(shí)現(xiàn)層面使用),ECMAScript里無法訪問這樣的屬性。
  • 注意,在ES5里{ReadOnly},{DontEnum}和{DontDelete}被重新命名為[[Writable]],[[Enumerable]]和[[Configurable]],可以手工通過Object.defineProperty或類似的方法來管理這些屬性。

    ?

    var foo = {}; Object.defineProperty(foo, "x", { value: 10, writable: true, // 即{ReadOnly} = false enumerable: false, // 即{DontEnum} = true configurable: true // 即{DontDelete} = false}); console.log(foo.x); // 10 // 通過descriptor獲取特性集attributesvar desc = Object.getOwnPropertyDescriptor(foo, "x"); console.log(desc.enumerable); // falseconsole.log(desc.writable); // true // 等等

    內(nèi)部屬性和方法

    對象也可以有內(nèi)部屬性(實(shí)現(xiàn)層面的一部分),并且ECMAScript程序無法直接訪問(但是下面我們將看到,一些實(shí)現(xiàn)允許訪問一些這樣的屬性)。 這些屬性通過嵌套的中括號[[ ]]進(jìn)行訪問。我們來看其中的一些,這些屬性的描述可以到規(guī)范里查閱到。

    每個(gè)對象都應(yīng)該實(shí)現(xiàn)如下內(nèi)部屬性和方法:

  • [[Prototype]]——對象的原型(將在下面詳細(xì)介紹)
  • [[Class]]——字符串對象的一種表示(例如,Object Array ,Function Object,Function等);用來區(qū)分對象
  • [[Get]]——獲得屬性值的方法
  • [[Put]]——設(shè)置屬性值的方法
  • [[CanPut]]——檢查屬性是否可寫
  • [[HasProperty]]——檢查對象是否已經(jīng)擁有該屬性
  • [[Delete]]——從對象刪除該屬性
  • [[DefaultValue]]返回對象對于的原始值(調(diào)用valueOf方法,某些對象可能會(huì)拋出TypeError異常)。
  • 通過Object.prototype.toString()方法可以間接得到內(nèi)部屬性[[Class]]的值,該方法應(yīng)該返回下列字符串: "[object " + [[Class]] + "]" 。例如:

    var getClass = Object.prototype.toString; getClass.call({}); // [object Object]getClass.call([]); // [object Array]getClass.call(new Number(1)); // [object Number] // 等等

    這個(gè)功能通常是用來檢查對象用的,但規(guī)范上說宿主對象的[[Class]]可以為任意值,包括內(nèi)置對象的[[Class]]屬性的值,所以理論上來看是不能100%來保證準(zhǔn)確的。例如,document.childNodes.item(...)方法的[[Class]]屬性,在IE里返回"String",但其它實(shí)現(xiàn)里返回的確實(shí)"Function"。

    // in IE - "String", in other - "Function"alert(getClass.call(document.childNodes.item));

    構(gòu)造函數(shù)

    因此,正如我們上面提到的,在ECMAScript中的對象是通過所謂的構(gòu)造函數(shù)來創(chuàng)建的。

    Constructor is a function that creates and initializes the newly created object. 構(gòu)造函數(shù)是一個(gè)函數(shù),用來創(chuàng)建并初始化新創(chuàng)建的對象。

    對象創(chuàng)建(內(nèi)存分配)是由構(gòu)造函數(shù)的內(nèi)部方法[[Construct]]負(fù)責(zé)的。該內(nèi)部方法的行為是定義好的,所有的構(gòu)造函數(shù)都是使用該方法來為新對象分配內(nèi)存的。

    而初始化是通過新建對象上下上調(diào)用該函數(shù)來管理的,這是由構(gòu)造函數(shù)的內(nèi)部方法[[Call]]來負(fù)責(zé)任的。

    注意,用戶代碼只能在初始化階段訪問,雖然在初始化階段我們可以返回不同的對象(忽略第一階段創(chuàng)建的tihs對象):

    function A() { // 更新新創(chuàng)建的對象 this.x = 10; // 但返回的是不同的對象 return [1, 2, 3]; } var a = new A(); console.log(a.x, a); undefined, [1, 2, 3]

    引用15章函數(shù)——?jiǎng)?chuàng)建函數(shù)的算法小節(jié),我們可以看到該函數(shù)是一個(gè)原生對象,包含[[Construct]] ]和[[Call]] ]屬性以及顯示的prototype原型屬性——未來對象的原型(注:NativeObject是對于native object原生對象的約定,在下面的偽代碼中使用)。

    F = new NativeObject(); F.[[Class]] = "Function" .... // 其它屬性 F.[[Call]] = <reference to function> // function自身 F.[[Construct]] = internalConstructor // 普通的內(nèi)部構(gòu)造函數(shù) .... // 其它屬性 // F構(gòu)造函數(shù)創(chuàng)建的對象原型__objectPrototype = {}; __objectPrototype.constructor = F // {DontEnum}F.prototype = __objectPrototype

    [[Call]] ]是除[[Class]]屬性(這里等同于"Function" )之外區(qū)分對象的主要方式,因此,對象的內(nèi)部[[Call]]屬性作為函數(shù)調(diào)用。 這樣的對象用typeof運(yùn)算操作符的話返回的是"function"。然而它主要是和原生對象有關(guān),有些情況的實(shí)現(xiàn)在用typeof獲取值的是不一樣的,例如:window.alert (...)在IE中的效果:

    // IE瀏覽器中 - "Object", "object", 其它瀏覽器 - "Function", "function"alert(Object.prototype.toString.call(window.alert)); alert(typeof window.alert); // "Object"

    內(nèi)部方法[[Construct]]是通過使用帶new運(yùn)算符的構(gòu)造函數(shù)來激活的,正如我們所說的這個(gè)方法是負(fù)責(zé)內(nèi)存分配和對象創(chuàng)建的。如果沒有參數(shù),調(diào)用構(gòu)造函數(shù)的括號也可以省略:

    function A(x) { // constructor А this.x = x || 10; } // 不傳參數(shù)的話,括號也可以省略var a = new A; // or new A();alert(a.x); // 10 // 顯式傳入?yún)?shù)xvar b = new A(20); alert(b.x); // 20

    我們也知道,構(gòu)造函數(shù)(初始化階段)里的shis被設(shè)置為新創(chuàng)建的對象 。

    讓我們研究一下對象創(chuàng)建的算法。

    對象創(chuàng)建的算法

    內(nèi)部方法[[Construct]] 的行為可以描述成如下:

    F.[[Construct]](initialParameters): O = new NativeObject(); // 屬性[[Class]]被設(shè)置為"Object"O.[[Class]] = "Object" // 引用F.prototype的時(shí)候獲取該對象gvar __objectPrototype = F.prototype; // 如果__objectPrototype是對象,就:O.[[Prototype]] = __objectPrototype // 否則:O.[[Prototype]] = Object.prototype; // 這里O.[[Prototype]]是Object對象的原型 // 新創(chuàng)建對象初始化的時(shí)候應(yīng)用了F.[[Call]] // 將this設(shè)置為新創(chuàng)建的對象O // 參數(shù)和F里的initialParameters是一樣的R = F.[[Call]](initialParameters); this === O; // 這里R是[[Call]]的返回值 // 在JS里看,像這樣: // R = F.apply(O, initialParameters); // 如果R是對象return R // 否則return O

    請注意兩個(gè)主要特點(diǎn):

  • 首先,新創(chuàng)建對象的原型是從當(dāng)前時(shí)刻函數(shù)的prototype屬性獲取的(這意味著同一個(gè)構(gòu)造函數(shù)創(chuàng)建的兩個(gè)創(chuàng)建對象的原型可以不同是因?yàn)楹瘮?shù)的prototype屬性也可以不同)。
  • 其次,正如我們上面提到的,如果在對象初始化的時(shí)候,[[Call]]返回的是對象,這恰恰是用于整個(gè)new操作符的結(jié)果:
  • function A() {} A.prototype.x = 10; var a = new A(); alert(a.x); // 10 – 從原型上得到 // 設(shè)置.prototype屬性為新對象 // 為什么顯式聲明.constructor屬性將在下面說明A.prototype = { constructor: A, y: 100 }; var b = new A(); // 對象"b"有了新屬性alert(b.x); // undefinedalert(b.y); // 100 – 從原型上得到 // 但a對象的原型依然可以得到原來的結(jié)果alert(a.x); // 10 - 從原型上得到 function B() { this.x = 10; return new Array(); } // 如果"B"構(gòu)造函數(shù)沒有返回(或返回this) // 那么this對象就可以使用,但是下面的情況返回的是arrayvar b = new B(); alert(b.x); // undefinedalert(Object.prototype.toString.call(b)); // [object Array]

    讓我們來詳細(xì)了解一下原型

    原型

    每個(gè)對象都有一個(gè)原型(一些系統(tǒng)對象除外)。原型通信是通過內(nèi)部的、隱式的、不可直接訪問[[Prototype]]原型屬性來進(jìn)行的,原型可以是一個(gè)對象,也可以是null值。

    屬性構(gòu)造函數(shù)(Property constructor)

    上面的例子有有2個(gè)重要的知識點(diǎn),第一個(gè)是關(guān)于函數(shù)的constructor屬性的prototype屬性,在函數(shù)創(chuàng)建的算法里,我們知道constructor屬性在函數(shù)創(chuàng)建階段被設(shè)置為函數(shù)的prototype屬性,constructor屬性的值是函數(shù)自身的重要引用:

    function A() {} var a = new A(); alert(a.constructor); // function A() {}, by delegationalert(a.constructor === A); // true

    通常在這種情況下,存在著一個(gè)誤區(qū):constructor構(gòu)造屬性作為新創(chuàng)建對象自身的屬性是錯(cuò)誤的,但是,正如我們所看到的的,這個(gè)屬性屬于原型并且通過繼承來訪問對象。

    通過繼承constructor屬性的實(shí)例,可以間接得到的原型對象的引用:

    function A() {} A.prototype.x = new Number(10); var a = new A(); alert(a.constructor.prototype); // [object Object] alert(a.x); // 10, 通過原型 // 和a.[[Prototype]].x效果一樣alert(a.constructor.prototype.x); // 10 alert(a.constructor.prototype.x === a.x); // true

    但請注意,函數(shù)的constructor和prototype屬性在對象創(chuàng)建以后都可以重新定義的。在這種情況下,對象失去上面所說的機(jī)制。如果通過函數(shù)的prototype屬性去編輯元素的prototype原型的話(添加新對象或修改現(xiàn)有對象),實(shí)例上將看到新添加的屬性。

    然而,如果我們徹底改變函數(shù)的prototype屬性(通過分配一個(gè)新的對象),那原始構(gòu)造函數(shù)的引用就是丟失,這是因?yàn)槲覀儎?chuàng)建的對象不包括constructor屬性:

    function A() {} A.prototype = { x: 10 }; var a = new A(); alert(a.x); // 10alert(a.constructor === A); // false!

    因此,對函數(shù)的原型引用需要手工恢復(fù):

    function A() {} A.prototype = { constructor: A, x: 10 }; var a = new A(); alert(a.x); // 10alert(a.constructor === A); // true

    注意雖然手動(dòng)恢復(fù)了constructor屬性,和原來丟失的原型相比,{DontEnum}特性沒有了,也就是說A.prototype里的for..in循環(huán)語句不支持了,不過第5版規(guī)范里,通過[[Enumerable]] 特性提供了控制可枚舉狀態(tài)enumerable的能力。

    var foo = {x: 10}; Object.defineProperty(foo, "y", { value: 20, enumerable: false // aka {DontEnum} = true}); console.log(foo.x, foo.y); // 10, 20 for (var k in foo) { console.log(k); // only "x"} var xDesc = Object.getOwnPropertyDescriptor(foo, "x"); var yDesc = Object.getOwnPropertyDescriptor(foo, "y"); console.log( xDesc.enumerable, // true yDesc.enumerable // false);

    顯式prototype和隱式[[Prototype]]屬性

    通常,一個(gè)對象的原型通過函數(shù)的prototype屬性顯式引用是不正確的,他引用的是同一個(gè)對象,對象的[[Prototype]]屬性:

    a.[[Prototype]] ----> Prototype <---- A.prototype

    此外, 實(shí)例的[[Prototype]]值確實(shí)是在構(gòu)造函數(shù)的prototype屬性上獲取的。

    然而,提交prototype屬性不會(huì)影響已經(jīng)創(chuàng)建對象的原型(只有在構(gòu)造函數(shù)的prototype屬性改變的時(shí)候才會(huì)影響到),就是說新創(chuàng)建的對象才有有新的原型,而已創(chuàng)建對象還是引用到原來的舊原型(這個(gè)原型已經(jīng)不能被再被修改了)。

    // 在修改A.prototype原型之前的情況a.[[Prototype]] ----> Prototype <---- A.prototype // 修改之后A.prototype ----> New prototype // 新對象會(huì)擁有這個(gè)原型a.[[Prototype]] ----> Prototype // 引導(dǎo)的原來的原型上

    例如:

    function A() {} A.prototype.x = 10; var a = new A(); alert(a.x); // 10 A.prototype = { constructor: A, x: 20 y: 30 }; // 對象a是通過隱式的[[Prototype]]引用從原油的prototype上獲取的值alert(a.x); // 10alert(a.y) // undefined var b = new A(); // 但新對象是從新原型上獲取的值alert(b.x); // 20alert(b.y) // 30

    因此,有的文章說“動(dòng)態(tài)修改原型將影響所有的對象都會(huì)擁有新的原型”是錯(cuò)誤的,新原型僅僅在原型修改以后的新創(chuàng)建對象上生效。

    這里的主要規(guī)則是:對象的原型是對象的創(chuàng)建的時(shí)候創(chuàng)建的,并且在此之后不能修改為新的對象,如果依然引用到同一個(gè)對象,可以通過構(gòu)造函數(shù)的顯式prototype引用,對象創(chuàng)建以后,只能對原型的屬性進(jìn)行添加或修改。

    非標(biāo)準(zhǔn)的__proto__屬性

    然而,有些實(shí)現(xiàn)(例如SpiderMonkey),提供了不標(biāo)準(zhǔn)的__proto__顯式屬性來引用對象的原型:

    function A() {} A.prototype.x = 10; var a = new A(); alert(a.x); // 10 var __newPrototype = { constructor: A, x: 20, y: 30 }; // 引用到新對象A.prototype = __newPrototype; var b = new A(); alert(b.x); // 20alert(b.y); // 30 // "a"對象使用的依然是舊的原型alert(a.x); // 10alert(a.y); // undefined // 顯式修改原型a.__proto__ = __newPrototype; // 現(xiàn)在"а"對象引用的是新對象alert(a.x); // 20alert(a.y); // 30

    注意,ES5提供了Object.getPrototypeOf(O)方法,該方法直接返回對象的[[Prototype]]屬性——實(shí)例的初始原型。 然而,和__proto__相比,它只是getter,它不允許set值。

    var foo = {}; Object.getPrototypeOf(foo) == Object.prototype; // true

    對象獨(dú)立于構(gòu)造函數(shù)

    因?yàn)閷?shí)例的原型獨(dú)立于構(gòu)造函數(shù)和構(gòu)造函數(shù)的prototype屬性,構(gòu)造函數(shù)完成了自己的主要工作(創(chuàng)建對象)以后可以刪除。原型對象通過引用[[Prototype]]屬性繼續(xù)存在:

    function A() {} A.prototype.x = 10; var a = new A(); alert(a.x); // 10 // 設(shè)置A為null - 顯示引用構(gòu)造函數(shù)A = null; // 但如果.constructor屬性沒有改變的話, // 依然可以通過它創(chuàng)建對象var b = new a.constructor(); alert(b.x); // 10 // 隱式的引用也刪除掉delete a.constructor.prototype.constructor; delete b.constructor.prototype.constructor; // 通過A的構(gòu)造函數(shù)再也不能創(chuàng)建對象了 // 但這2個(gè)對象依然有自己的原型alert(a.x); // 10alert(b.x); // 10

    instanceof操作符的特性

    我們是通過構(gòu)造函數(shù)的prototype屬性來顯示引用原型的,這和instanceof操作符有關(guān)。該操作符是和原型鏈一起工作的,而不是構(gòu)造函數(shù),考慮到這一點(diǎn),當(dāng)檢測對象的時(shí)候往往會(huì)有誤解:

    if (foo instanceof Foo) { ... }

    這不是用來檢測對象foo是否是用Foo構(gòu)造函數(shù)創(chuàng)建的,所有instanceof運(yùn)算符只需要一個(gè)對象屬性——foo.[[Prototype]],在原型鏈中從Foo.prototype開始檢查其是否存在。instanceof運(yùn)算符是通過構(gòu)造函數(shù)里的內(nèi)部方法[[HasInstance]]來激活的。

    讓我們來看看這個(gè)例子:

    function A() {} A.prototype.x = 10; var a = new A(); alert(a.x); // 10 alert(a instanceof A); // true // 如果設(shè)置原型為nullA.prototype = null; // ..."a"依然可以通過a.[[Prototype]]訪問原型alert(a.x); // 10 // 不過,instanceof操作符不能再正常使用了 // 因?yàn)樗菑臉?gòu)造函數(shù)的prototype屬性來實(shí)現(xiàn)的alert(a instanceof A); // 錯(cuò)誤,A.prototype不是對象

    另一方面,可以由構(gòu)造函數(shù)來創(chuàng)建對象,但如果對象的[[Prototype]]屬性和構(gòu)造函數(shù)的prototype屬性的值設(shè)置的是一樣的話,instanceof檢查的時(shí)候會(huì)返回true:

    function B() {} var b = new B(); alert(b instanceof B); // true function C() {} var __proto = { constructor: C }; C.prototype = __proto; b.__proto__ = __proto; alert(b instanceof C); // truealert(b instanceof B); // false

    原型可以存放方法并共享屬性

    大部分程序里使用原型是用來存儲對象的方法、默認(rèn)狀態(tài)和共享對象的屬性。

    事實(shí)上,對象可以擁有自己的狀態(tài) ,但方法通常是一樣的。 因此,為了內(nèi)存優(yōu)化,方法通常是在原型里定義的。 這意味著,這個(gè)構(gòu)造函數(shù)創(chuàng)建的所有實(shí)例都可以共享找個(gè)方法。

    function A(x) { this.x = x || 100; } A.prototype = (function () { // 初始化上下文 // 使用額外的對象 var _someSharedVar = 500; function _someHelper() { alert('internal helper: ' + _someSharedVar); } function method1() { alert('method1: ' + this.x); } function method2() { alert('method2: ' + this.x); _someHelper(); } // 原型自身 return { constructor: A, method1: method1, method2: method2 }; })(); var a = new A(10); var b = new A(20); a.method1(); // method1: 10a.method2(); // method2: 10, internal helper: 500 b.method1(); // method1: 20b.method2(); // method2: 20, internal helper: 500 // 2個(gè)對象使用的是原型里相同的方法alert(a.method1 === b.method1); // truealert(a.method2 === b.method2); // true

    讀寫屬性

    正如我們提到,讀取和寫入屬性值是通過內(nèi)部的[[Get]]和[[Put]]方法。這些內(nèi)部方法是通過屬性訪問器激活的:點(diǎn)標(biāo)記法或者索引標(biāo)記法:

    // 寫入foo.bar = 10; // 調(diào)用了[[Put]] console.log(foo.bar); // 10, 調(diào)用了[[Get]]console.log(foo['bar']); // 效果一樣

    讓我們用偽代碼來看一下這些方法是如何工作的:

    [[Get]]方法

    [[Get]]也會(huì)從原型鏈中查詢屬性,所以通過對象也可以訪問原型中的屬性。

    O.[[Get]](P): // 如果是自己的屬性,就返回if (O.hasOwnProperty(P)) { return O.P; } // 否則,繼續(xù)分析原型var __proto = O.[[Prototype]]; // 如果原型是null,返回undefined // 這是可能的:最頂層Object.prototype.[[Prototype]]是nullif (__proto === null) { return undefined; } // 否則,對原型鏈遞歸調(diào)用[[Get]],在各層的原型中查找屬性 // 直到原型為nullreturn __proto.[[Get]](P)

    請注意,因?yàn)閇[Get]]在如下情況也會(huì)返回undefined:

    if (window.someObject) { ... }

    這里,在window里沒有找到someObject屬性,然后會(huì)在原型里找,原型的原型里找,以此類推,如果都找不到,按照定義就返回undefined。

    注意:in操作符也可以負(fù)責(zé)查找屬性(也會(huì)查找原型鏈):

    if ('someObject' in window) { ... }

    這有助于避免一些特殊問題:比如即便someObject存在,在someObject等于false的時(shí)候,第一輪檢測就通不過。

    [[Put]]方法

    [[Put]]方法可以創(chuàng)建、更新對象自身的屬性,并且掩蓋原型里的同名屬性。

    O.[[Put]](P, V): // 如果不能給屬性寫值,就退出if (!O.[[CanPut]](P)) { return; } // 如果對象沒有自身的屬性,就創(chuàng)建它 // 所有的attributes特性都是falseif (!O.hasOwnProperty(P)) { createNewProperty(O, P, attributes: { ReadOnly: false, DontEnum: false, DontDelete: false, Internal: false }); } // 如果屬性存在就設(shè)置值,但不改變attributes特性O.P = V return;

    例如:

    Object.prototype.x = 100; var foo = {}; console.log(foo.x); // 100, 繼承屬性 foo.x = 10; // [[Put]]console.log(foo.x); // 10, 自身屬性 delete foo.x; console.log(foo.x); // 重新是100,繼承屬性

    請注意,不能掩蓋原型里的只讀屬性,賦值結(jié)果將忽略,這是由內(nèi)部方法[[CanPut]]控制的。

    // 例如,屬性length是只讀的,我們來掩蓋一下length試試 function SuperString() { /* nothing */ } SuperString.prototype = new String("abc"); var foo = new SuperString(); console.log(foo.length); // 3, "abc"的長度 // 嘗試掩蓋foo.length = 5; console.log(foo.length); // 依然是3

    但在ES5的嚴(yán)格模式下,如果掩蓋只讀屬性的話,會(huì)保存TypeError錯(cuò)誤。

    屬性訪問器

    內(nèi)部方法[[Get]]和[[Put]]在ECMAScript里是通過點(diǎn)符號或者索引法來激活的,如果屬性標(biāo)示符是合法的名字的話,可以通過“.”來訪問,而索引方運(yùn)行動(dòng)態(tài)定義名稱。

    var a = {testProperty: 10}; alert(a.testProperty); // 10, 點(diǎn)alert(a['testProperty']); // 10, 索引 var propertyName = 'Property'; alert(a['test' + propertyName]); // 10, 動(dòng)態(tài)屬性通過索引的方式

    這里有一個(gè)非常重要的特性——屬性訪問器總是使用ToObject規(guī)范來對待“.”左邊的值。這種隱式轉(zhuǎn)化和這句“在JavaScript中一切都是對象”有關(guān)系,(然而,當(dāng)我們已經(jīng)知道了,JavaScript里不是所有的值都是對象)。

    如果對原始值進(jìn)行屬性訪問器取值,訪問之前會(huì)先對原始值進(jìn)行對象包裝(包括原始值),然后通過包裝的對象進(jìn)行訪問屬性,屬性訪問以后,包裝對象就會(huì)被刪除。

    例如:

    var a = 10; // 原始值 // 但是可以訪問方法(就像對象一樣)alert(a.toString()); // "10" // 此外,我們可以在a上創(chuàng)建一個(gè)心屬性a.test = 100; // 好像是沒問題的 // 但,[[Get]]方法沒有返回該屬性的值,返回的卻是undefinedalert(a.test); // undefined

    那么,為什么整個(gè)例子里的原始值可以訪問toString方法,而不能訪問新創(chuàng)建的test屬性呢?

    答案很簡單:

    首先,正如我們所說,使用屬性訪問器以后,它已經(jīng)不是原始值了,而是一個(gè)包裝過的中間對象(整個(gè)例子是使用new Number(a)),而toString方法這時(shí)候是通過原型鏈查找到的:

    // 執(zhí)行a.toString()的原理: 1. wrapper = new Number(a); 2. wrapper.toString(); // "10"3. delete wrapper;

    接下來,[[Put]]方法創(chuàng)建新屬性時(shí)候,也是通過包裝裝的對象進(jìn)行的:

    // 執(zhí)行a.test = 100的原理: 1. wrapper = new Number(a); 2. wrapper.test = 100; 3. delete wrapper;

    我們看到,在第3步的時(shí)候,包裝的對象以及刪除了,隨著新創(chuàng)建的屬性頁被刪除了——?jiǎng)h除包裝對象本身。

    然后使用[[Get]]獲取test值的時(shí)候,再一次創(chuàng)建了包裝對象,但這時(shí)候包裝的對象已經(jīng)沒有test屬性了,所以返回的是undefined:

    // 執(zhí)行a.test的原理: 1. wrapper = new Number(a); 2. wrapper.test; // undefined

    這種方式解釋了原始值的讀取方式,另外,任何原始值如果經(jīng)常用在訪問屬性的話,時(shí)間效率考慮,都是直接用一個(gè)對象替代它;與此相反,如果不經(jīng)常訪問,或者只是用于計(jì)算的話,到可以保留這種形式。

    繼承

    我們知道,ECMAScript是使用基于原型的委托式繼承。鏈和原型在原型鏈里已經(jīng)提到過了。其實(shí),所有委托的實(shí)現(xiàn)和原型鏈的查找分析都濃縮到[[Get]]方法了。

    如果你完全理解[[Get]]方法,那JavaScript中的繼承這個(gè)問題將不解自答了。

    經(jīng)常在論壇上談?wù)揓avaScript中的繼承時(shí),我都是用一行代碼來展示,事實(shí)上,我們不需要?jiǎng)?chuàng)建任何對象或函數(shù),因?yàn)樵撜Z言已經(jīng)是基于繼承的了,代碼如下:

    alert(1..toString()); // "1"

    我們已經(jīng)知道了[[Get]]方法和屬性訪問器的原理了,我們來看看都發(fā)生了什么:

  • 首先,從原始值1,通過new Number(1)創(chuàng)建包裝對象
  • 然后toString方法是從這個(gè)包裝對象上繼承得到的
  • 為什么是繼承的? 因?yàn)樵贓CMAScript中的對象可以有自己的屬性,包裝對象在這種情況下沒有toString方法。 因此它是從原理里繼承的,即Number.prototype。

    注意有個(gè)微妙的地方,在上面的例子中的兩個(gè)點(diǎn)不是一個(gè)錯(cuò)誤。第一點(diǎn)是代表小數(shù)部分,第二個(gè)才是一個(gè)屬性訪問器:

    1.toString(); // 語法錯(cuò)誤! (1).toString(); // OK 1..toString(); // OK 1['toString'](); // OK

    原型鏈

    讓我們展示如何為用戶定義對象創(chuàng)建原型鏈,非常簡單:

    function A() { alert('A.[[Call]] activated'); this.x = 10; } A.prototype.y = 20; var a = new A(); alert([a.x, a.y]); // 10 (自身), 20 (繼承) function B() {} // 最近的原型鏈方式就是設(shè)置對象的原型為另外一個(gè)新對象B.prototype = new A(); // 修復(fù)原型的constructor屬性,否則的話是A了 B.prototype.constructor = B; var b = new B(); alert([b.x, b.y]); // 10, 20, 2個(gè)都是繼承的 // [[Get]] b.x: // b.x (no) --> // b.[[Prototype]].x (yes) - 10 // [[Get]] b.y // b.y (no) --> // b.[[Prototype]].y (no) --> // b.[[Prototype]].[[Prototype]].y (yes) - 20 // where b.[[Prototype]] === B.prototype, // and b.[[Prototype]].[[Prototype]] === A.prototype

    這種方法有兩個(gè)特性:

    首先,B.prototype將包含x屬性。乍一看這可能不對,你可能會(huì)想x屬性是在A里定義的并且B構(gòu)造函數(shù)也是這樣期望的。盡管原型繼承正常情況是沒問題的,但B構(gòu)造函數(shù)有時(shí)候可能不需要x屬性,與基于class的繼承相比,所有的屬性都復(fù)制到后代子類里了。

    盡管如此,如果有需要(模擬基于類的繼承)將x屬性賦給B構(gòu)造函數(shù)創(chuàng)建的對象上,有一些方法,我們后來來展示其中一種方式。

    其次,這不是一個(gè)特征而是缺點(diǎn)——子類原型創(chuàng)建的時(shí)候,構(gòu)造函數(shù)的代碼也執(zhí)行了,我們可以看到消息"A.[[Call]] activated"顯示了兩次——當(dāng)用A構(gòu)造函數(shù)創(chuàng)建對象賦給B.prototype屬性的時(shí)候,另外一場是a對象創(chuàng)建自身的時(shí)候!

    下面的例子比較關(guān)鍵,在父類的構(gòu)造函數(shù)拋出的異常:可能實(shí)際對象創(chuàng)建的時(shí)候需要檢查吧,但很明顯,同樣的case,也就是就是使用這些父對象作為原型的時(shí)候就會(huì)出錯(cuò)。

    function A(param) { if (!param) { throw 'Param required'; } this.param = param; } A.prototype.x = 10; var a = new A(20); alert([a.x, a.param]); // 10, 20 function B() {} B.prototype = new A(); // Error

    此外,在父類的構(gòu)造函數(shù)有太多代碼的話也是一種缺點(diǎn)。

    解決這些“功能”和問題,程序員使用原型鏈的標(biāo)準(zhǔn)模式(下面展示),主要目的就是在中間包裝構(gòu)造函數(shù)的創(chuàng)建,這些包裝構(gòu)造函數(shù)的鏈里包含需要的原型。

    function A() { alert('A.[[Call]] activated'); this.x = 10; } A.prototype.y = 20; var a = new A(); alert([a.x, a.y]); // 10 (自身), 20 (集成) function B() { // 或者使用A.apply(this, arguments) B.superproto.constructor.apply(this, arguments); } // 繼承:通過空的中間構(gòu)造函數(shù)將原型連在一起var F = function () {}; F.prototype = A.prototype; // 引用B.prototype = new F(); B.superproto = A.prototype; // 顯示引用到另外一個(gè)原型上, "sugar" // 修復(fù)原型的constructor屬性,否則的就是A了B.prototype.constructor = B; var b = new B(); alert([b.x, b.y]); // 10 (自身), 20 (集成)

    注意,我們在b實(shí)例上創(chuàng)建了自己的x屬性,通過B.superproto.constructor調(diào)用父構(gòu)造函數(shù)來引用新創(chuàng)建對象的上下文。

    我們也修復(fù)了父構(gòu)造函數(shù)在創(chuàng)建子原型的時(shí)候不需要的調(diào)用,此時(shí),消息"A.[[Call]] activated"在需要的時(shí)候才會(huì)顯示。

    為了在原型鏈里重復(fù)相同的行為(中間構(gòu)造函數(shù)創(chuàng)建,設(shè)置superproto,恢復(fù)原始構(gòu)造函數(shù)),下面的模板可以封裝成一個(gè)非常方面的工具函數(shù),其目的是連接原型的時(shí)候不是根據(jù)構(gòu)造函數(shù)的實(shí)際名稱。

    function inherit(child, parent) { var F = function () {}; F.prototype = parent.prototype child.prototype = new F(); child.prototype.constructor = child; child.superproto = parent.prototype; return child; }

    因此,繼承:

    function A() {} A.prototype.x = 10; function B() {} inherit(B, A); // 連接原型 var b = new B(); alert(b.x); // 10, 在A.prototype查找到

    也有很多語法形式(包裝而成),但所有的語法行都是為了減少上述代碼里的行為。

    例如,如果我們把中間的構(gòu)造函數(shù)放到外面,就可以優(yōu)化前面的代碼(因此,只有一個(gè)函數(shù)被創(chuàng)建),然后重用它:

    var inherit = (function(){ function F() {} return function (child, parent) { F.prototype = parent.prototype; child.prototype = new F; child.prototype.constructor = child; child.superproto = parent.prototype; return child; }; })();

    由于對象的真實(shí)原型是[[Prototype]]屬性,這意味著F.prototype可以很容易修改和重用,因?yàn)橥ㄟ^new F創(chuàng)建的child.prototype可以從child.prototype的當(dāng)前值里獲取[[Prototype]]:

    function A() {} A.prototype.x = 10; function B() {} inherit(B, A); B.prototype.y = 20; B.prototype.foo = function () { alert("B#foo"); }; var b = new B(); alert(b.x); // 10, 在A.prototype里查到 function C() {} inherit(C, B); // 使用"superproto"語法糖 // 調(diào)用父原型的同名方法 C.ptototype.foo = function () { C.superproto.foo.call(this); alert("C#foo"); }; var c = new C(); alert([c.x, c.y]); // 10, 20 c.foo(); // B#foo, C#foo

    注意,ES5為原型鏈標(biāo)準(zhǔn)化了這個(gè)工具函數(shù),那就是Object.create方法。ES3可以使用以下方式實(shí)現(xiàn):

    Object.create || Object.create = function (parent, properties) { function F() {} F.prototype = parent; var child = new F; for (var k in properties) { child[k] = properties[k].value; } return child; }
    // 用法var foo = {x: 10}; var bar = Object.create(foo, {y: {value: 20}}); console.log(bar.x, bar.y); // 10, 20

    此外,所有模仿現(xiàn)在基于類的經(jīng)典繼承方式都是根據(jù)這個(gè)原則實(shí)現(xiàn)的,現(xiàn)在可以看到,它實(shí)際上不是基于類的繼承,而是連接原型的一個(gè)很方便的代碼重用。

    結(jié)論

    本章內(nèi)容已經(jīng)很充分和詳細(xì)了,希望這些資料對你有用,并且消除你對ECMAScript的疑問,如果你有任何問題,請留言,我們一起討論。

    其它參考

    • 4.2 — Language Overview;
    • 4.3 — Definitions;
    • 7.8.5 — Regular Expression Literals;
    • 8 — Types;
    • 9 — Type Conversion;
    • 11.1.4 — Array Initialiser;
    • 11.1.5 — Object Initialiser;
    • 11.2.2 — The new Operator;
    • 13.2.1 — [[Call]];
    • 13.2.2 — [[Construct]];
    • 15 — Native ECMAScript Objects.

    轉(zhuǎn)載于:https://www.cnblogs.com/softlover/articles/2612303.html

    超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

    總結(jié)

    以上是生活随笔為你收集整理的深入理解JavaScript系列(18):面向对象编程之ECMAScript实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    国产福利视频一区二区 | 亚洲va欧美va天堂v国产综合 | 亚洲色www成人永久网址 | 欧美日韩一区二区三区自拍 | 中文字幕无码视频专区 | 国产欧美亚洲精品a | 婷婷色婷婷开心五月四房播播 | 久久久久国色av免费观看性色 | 日本在线高清不卡免费播放 | 亚洲欧美国产精品久久 | 无码av最新清无码专区吞精 | 老熟女乱子伦 | 少妇被粗大的猛进出69影院 | 成人性做爰aaa片免费看不忠 | 少妇人妻偷人精品无码视频 | 亚洲国产精品无码久久久久高潮 | 妺妺窝人体色www在线小说 | 国产精品亚洲一区二区三区喷水 | 中文字幕久久久久人妻 | 国产精品无码成人午夜电影 | 日韩人妻无码一区二区三区久久99 | 天天躁日日躁狠狠躁免费麻豆 | 国产精品美女久久久网av | 久久久精品人妻久久影视 | 熟女体下毛毛黑森林 | 色综合久久中文娱乐网 | 国产精品视频免费播放 | 久久精品丝袜高跟鞋 | 又大又黄又粗又爽的免费视频 | 色 综合 欧美 亚洲 国产 | 国产无套内射久久久国产 | 国产精品沙发午睡系列 | 久久天天躁夜夜躁狠狠 | 免费人成网站视频在线观看 | 国产成人无码区免费内射一片色欲 | 国产又粗又硬又大爽黄老大爷视 | 国产麻豆精品精东影业av网站 | 精品熟女少妇av免费观看 | 欧美肥老太牲交大战 | 骚片av蜜桃精品一区 | 无遮挡啪啪摇乳动态图 | 国产亚洲精品久久久久久国模美 | 夫妻免费无码v看片 | 麻豆国产丝袜白领秘书在线观看 | 骚片av蜜桃精品一区 | 丰满人妻被黑人猛烈进入 | a片免费视频在线观看 | а√资源新版在线天堂 | 亚洲乱码国产乱码精品精 | 欧美日本免费一区二区三区 | 欧美丰满少妇xxxx性 | 内射老妇bbwx0c0ck | 国产成人精品三级麻豆 | 国产精品人人爽人人做我的可爱 | 国产一区二区三区影院 | 国产亚洲精品久久久ai换 | 国产麻豆精品精东影业av网站 | 日本一卡二卡不卡视频查询 | 欧美性猛交内射兽交老熟妇 | 无套内谢的新婚少妇国语播放 | 精品乱子伦一区二区三区 | 九九久久精品国产免费看小说 | 欧美亚洲国产一区二区三区 | 久久精品国产日本波多野结衣 | 亚洲a无码综合a国产av中文 | 成人女人看片免费视频放人 | 小sao货水好多真紧h无码视频 | 久久综合狠狠综合久久综合88 | 精品国产一区二区三区av 性色 | 中文字幕日韩精品一区二区三区 | 欧美激情一区二区三区成人 | 撕开奶罩揉吮奶头视频 | 国产免费观看黄av片 | 狠狠躁日日躁夜夜躁2020 | 成人免费视频视频在线观看 免费 | 三上悠亚人妻中文字幕在线 | 76少妇精品导航 | 欧美丰满熟妇xxxx性ppx人交 | 爆乳一区二区三区无码 | 无码精品人妻一区二区三区av | 日本肉体xxxx裸交 | 无码吃奶揉捏奶头高潮视频 | 人人妻人人藻人人爽欧美一区 | 国产亚洲视频中文字幕97精品 | 国产手机在线αⅴ片无码观看 | 娇妻被黑人粗大高潮白浆 | 真人与拘做受免费视频一 | 少妇性俱乐部纵欲狂欢电影 | 国产无遮挡吃胸膜奶免费看 | 婷婷五月综合缴情在线视频 | 午夜免费福利小电影 | 一二三四在线观看免费视频 | 丰满人妻一区二区三区免费视频 | 精品无码av一区二区三区 | 风流少妇按摩来高潮 | 天天摸天天碰天天添 | 国内精品九九久久久精品 | 久久99精品久久久久久 | 精品熟女少妇av免费观看 | 亚洲国产综合无码一区 | 乱中年女人伦av三区 | 欧洲欧美人成视频在线 | 国产一区二区不卡老阿姨 | 97色伦图片97综合影院 | 鲁鲁鲁爽爽爽在线视频观看 | 成人性做爰aaa片免费看不忠 | 少妇无码av无码专区在线观看 | 欧美日韩一区二区综合 | 2019nv天堂香蕉在线观看 | 亚洲人交乣女bbw | 国精品人妻无码一区二区三区蜜柚 | 久久国产精品二国产精品 | 国产超级va在线观看视频 | 强奷人妻日本中文字幕 | 久久精品国产99精品亚洲 | 国产莉萝无码av在线播放 | 亚洲另类伦春色综合小说 | 精品无人区无码乱码毛片国产 | 国产精品丝袜黑色高跟鞋 | 中文字幕无码av激情不卡 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 人人妻人人澡人人爽欧美一区九九 | 国产欧美熟妇另类久久久 | 内射巨臀欧美在线视频 | 中文字幕中文有码在线 | 亚洲综合无码久久精品综合 | 男人和女人高潮免费网站 | 国产成人综合美国十次 | 亚洲乱码国产乱码精品精 | 亚洲天堂2017无码 | 国产成人无码一二三区视频 | 精品国产aⅴ无码一区二区 | 性做久久久久久久久 | 成 人影片 免费观看 | 玩弄少妇高潮ⅹxxxyw | 水蜜桃亚洲一二三四在线 | 中文字幕无线码免费人妻 | 青春草在线视频免费观看 | 丰满少妇人妻久久久久久 | 中文无码成人免费视频在线观看 | 男女性色大片免费网站 | 性欧美videos高清精品 | 在线视频网站www色 | 7777奇米四色成人眼影 | 荫蒂被男人添的好舒服爽免费视频 | 六十路熟妇乱子伦 | 精品国偷自产在线 | 国产无套粉嫩白浆在线 | 亚洲の无码国产の无码影院 | 嫩b人妻精品一区二区三区 | www国产亚洲精品久久网站 | 真人与拘做受免费视频一 | 亚洲成色在线综合网站 | 亚洲成av人综合在线观看 | 夜夜躁日日躁狠狠久久av | 亚洲中文字幕成人无码 | 性欧美牲交在线视频 | 久久99精品久久久久久动态图 | 亚洲狠狠婷婷综合久久 | 激情亚洲一区国产精品 | 成人亚洲精品久久久久软件 | 国产午夜亚洲精品不卡 | 国产精品毛多多水多 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国内精品久久毛片一区二区 | 亚洲 欧美 激情 小说 另类 | 2020最新国产自产精品 | 青青草原综合久久大伊人精品 | 久久人人爽人人人人片 | 麻豆国产人妻欲求不满谁演的 | 午夜理论片yy44880影院 | 免费国产成人高清在线观看网站 | 欧美日韩一区二区三区自拍 | 97久久精品无码一区二区 | 亚洲自偷自偷在线制服 | 日本护士xxxxhd少妇 | 国产精品沙发午睡系列 | 乱人伦人妻中文字幕无码久久网 | 网友自拍区视频精品 | 免费播放一区二区三区 | 亚洲日韩乱码中文无码蜜桃臀网站 | 久久精品国产一区二区三区 | 国产精品久久久午夜夜伦鲁鲁 | 国产亚洲人成在线播放 | 国产精品无码成人午夜电影 | 国产精品久久久av久久久 | 小泽玛莉亚一区二区视频在线 | 精品久久久久香蕉网 | 中文字幕无码人妻少妇免费 | 国产精品久久久久无码av色戒 | 在线观看国产一区二区三区 | 人妻有码中文字幕在线 | 熟女少妇人妻中文字幕 | 日日碰狠狠躁久久躁蜜桃 | 欧美亚洲国产一区二区三区 | 精品欧洲av无码一区二区三区 | 久久97精品久久久久久久不卡 | 精品乱码久久久久久久 | 又湿又紧又大又爽a视频国产 | 国产精品99爱免费视频 | 亚洲の无码国产の无码影院 | 亚洲熟妇色xxxxx欧美老妇 | 亚洲自偷自偷在线制服 | 国产熟妇另类久久久久 | 5858s亚洲色大成网站www | 无人区乱码一区二区三区 | 97夜夜澡人人爽人人喊中国片 | 精品 日韩 国产 欧美 视频 | 日本va欧美va欧美va精品 | 丝袜美腿亚洲一区二区 | 国产高潮视频在线观看 | 四虎国产精品一区二区 | 亚洲七七久久桃花影院 | 欧美性生交xxxxx久久久 | 国产农村乱对白刺激视频 | 国产无遮挡吃胸膜奶免费看 | 久久久久久久人妻无码中文字幕爆 | 黑人大群体交免费视频 | 网友自拍区视频精品 | 亚洲乱码中文字幕在线 | 三级4级全黄60分钟 | 成人动漫在线观看 | 免费无码一区二区三区蜜桃大 | 亚洲七七久久桃花影院 | 国产精品毛片一区二区 | 国产精品对白交换视频 | 欧美老熟妇乱xxxxx | 久久久精品国产sm最大网站 | 精品人妻人人做人人爽 | 久久精品人人做人人综合试看 | 两性色午夜免费视频 | 97久久国产亚洲精品超碰热 | 亚洲一区二区三区播放 | 女人被男人躁得好爽免费视频 | 麻豆国产丝袜白领秘书在线观看 | 成年美女黄网站色大免费视频 | 一区二区三区高清视频一 | 色欲人妻aaaaaaa无码 | 亚洲精品国产精品乱码不卡 | 沈阳熟女露脸对白视频 | 成在人线av无码免观看麻豆 | 亲嘴扒胸摸屁股激烈网站 | 日日夜夜撸啊撸 | 亚洲中文字幕无码一久久区 | 日本饥渴人妻欲求不满 | 久久综合激激的五月天 | 97精品国产97久久久久久免费 | 亚洲精品午夜国产va久久成人 | 亚洲精品中文字幕久久久久 | 人妻有码中文字幕在线 | 国产区女主播在线观看 | 亚洲精品成人av在线 | 丰满人妻翻云覆雨呻吟视频 | 中文字幕无码免费久久9一区9 | 国内精品人妻无码久久久影院蜜桃 | 久久久久久久人妻无码中文字幕爆 | 中文无码精品a∨在线观看不卡 | 成年美女黄网站色大免费全看 | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲日本va午夜在线电影 | 乱人伦人妻中文字幕无码久久网 | 亚洲精品午夜无码电影网 | 小泽玛莉亚一区二区视频在线 | 国产综合久久久久鬼色 | 玩弄人妻少妇500系列视频 | 综合激情五月综合激情五月激情1 | 亚洲国产精品一区二区美利坚 | 一本久道久久综合婷婷五月 | 欧美一区二区三区 | а√资源新版在线天堂 | 国产精品高潮呻吟av久久4虎 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 亚洲 日韩 欧美 成人 在线观看 | 亚洲国产精品一区二区第一页 | 亚洲精品久久久久avwww潮水 | 亚洲精品午夜无码电影网 | 日韩少妇内射免费播放 | 图片区 小说区 区 亚洲五月 | 国产精品内射视频免费 | 麻豆人妻少妇精品无码专区 | 精品成在人线av无码免费看 | 日本xxxx色视频在线观看免费 | 国产亚洲欧美在线专区 | 又大又硬又黄的免费视频 | 妺妺窝人体色www婷婷 | 国产疯狂伦交大片 | 在教室伦流澡到高潮hnp视频 | 亚洲娇小与黑人巨大交 | 亚洲成熟女人毛毛耸耸多 | 国内精品一区二区三区不卡 | 国产后入清纯学生妹 | 国产精品高潮呻吟av久久 | 中文字幕无码日韩欧毛 | 欧美xxxxx精品 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产成人无码区免费内射一片色欲 | 永久免费观看美女裸体的网站 | 国产精品无套呻吟在线 | 国产精品久久久久久亚洲影视内衣 | 欧美性猛交内射兽交老熟妇 | 内射巨臀欧美在线视频 | 成人免费视频视频在线观看 免费 | 日韩精品一区二区av在线 | 亚洲 高清 成人 动漫 | 人妻无码αv中文字幕久久琪琪布 | 中文字幕无码人妻少妇免费 | 2019午夜福利不卡片在线 | 高清不卡一区二区三区 | 国产美女极度色诱视频www | 日日摸日日碰夜夜爽av | 亚洲第一无码av无码专区 | 欧美丰满少妇xxxx性 | 中国大陆精品视频xxxx | 亚洲人亚洲人成电影网站色 | 日日夜夜撸啊撸 | 55夜色66夜色国产精品视频 | 午夜无码人妻av大片色欲 | 日韩欧美群交p片內射中文 | 欧美国产日韩亚洲中文 | 又大又硬又爽免费视频 | 六十路熟妇乱子伦 | 国产av一区二区精品久久凹凸 | 国内精品久久毛片一区二区 | 亚洲啪av永久无码精品放毛片 | 欧美第一黄网免费网站 | 狂野欧美性猛xxxx乱大交 | 亚洲熟熟妇xxxx | 国产精品无码一区二区桃花视频 | 国产精品沙发午睡系列 | 无遮挡国产高潮视频免费观看 | 亚洲精品国偷拍自产在线麻豆 | 2020最新国产自产精品 | 国产偷自视频区视频 | 亚洲a无码综合a国产av中文 | 老熟妇仑乱视频一区二区 | 人妻无码久久精品人妻 | 国产在线无码精品电影网 | 77777熟女视频在线观看 а天堂中文在线官网 | 久久精品国产一区二区三区肥胖 | 又紧又大又爽精品一区二区 | 扒开双腿吃奶呻吟做受视频 | 成人亚洲精品久久久久软件 | 国产精品99爱免费视频 | 久久精品中文闷骚内射 | 国产精品久久久久7777 | 九九综合va免费看 | 一本色道久久综合亚洲精品不卡 | 色婷婷综合中文久久一本 | 色 综合 欧美 亚洲 国产 | 久久亚洲中文字幕精品一区 | 未满小14洗澡无码视频网站 | 精品少妇爆乳无码av无码专区 | 亚洲精品久久久久久久久久久 | 精品欧美一区二区三区久久久 | 2020久久超碰国产精品最新 | 国产精品人人妻人人爽 | 成年女人永久免费看片 | 日产精品99久久久久久 | 国产性生交xxxxx无码 | 亚洲最大成人网站 | 无码人妻黑人中文字幕 | 欧美老人巨大xxxx做受 | 国产成人无码av在线影院 | 国产av一区二区三区最新精品 | 国产精品二区一区二区aⅴ污介绍 | 一本久久a久久精品亚洲 | 99久久婷婷国产综合精品青草免费 | 国产综合色产在线精品 | 激情内射亚州一区二区三区爱妻 | 久久精品中文字幕大胸 | 67194成是人免费无码 | 国产成人无码av片在线观看不卡 | 亚洲精品美女久久久久久久 | 麻豆果冻传媒2021精品传媒一区下载 | 国产免费观看黄av片 | 国产色视频一区二区三区 | 欧美亚洲日韩国产人成在线播放 | 性欧美熟妇videofreesex | 亚洲精品国产品国语在线观看 | 亚洲高清偷拍一区二区三区 | 人妻与老人中文字幕 | 狠狠色噜噜狠狠狠7777奇米 | 国产成人综合美国十次 | 国产又粗又硬又大爽黄老大爷视 | 国产激情无码一区二区 | 玩弄少妇高潮ⅹxxxyw | 精品国产成人一区二区三区 | 正在播放老肥熟妇露脸 | 亚洲国产精华液网站w | 1000部啪啪未满十八勿入下载 | 久久天天躁狠狠躁夜夜免费观看 | 欧美怡红院免费全部视频 | 国产黄在线观看免费观看不卡 | 欧美野外疯狂做受xxxx高潮 | 中文无码精品a∨在线观看不卡 | 亚洲精品久久久久avwww潮水 | 亚洲日韩av一区二区三区中文 | 欧美丰满熟妇xxxx性ppx人交 | 中文字幕亚洲情99在线 | 人妻无码αv中文字幕久久琪琪布 | 男女爱爱好爽视频免费看 | 亚洲自偷精品视频自拍 | 成 人 免费观看网站 | 国产办公室秘书无码精品99 | 国内老熟妇对白xxxxhd | 三上悠亚人妻中文字幕在线 | 欧美激情综合亚洲一二区 | 精品夜夜澡人妻无码av蜜桃 | 天堂久久天堂av色综合 | 无码人妻久久一区二区三区不卡 | 色一情一乱一伦 | 人妻少妇精品久久 | 永久黄网站色视频免费直播 | 玩弄人妻少妇500系列视频 | 久久精品国产一区二区三区肥胖 | 免费国产成人高清在线观看网站 | 少妇太爽了在线观看 | 欧美激情内射喷水高潮 | 久久久久久九九精品久 | 中文字幕人妻无码一区二区三区 | 国产成人无码一二三区视频 | 成 人影片 免费观看 | 日本丰满熟妇videos | 色噜噜亚洲男人的天堂 | 中文字幕日韩精品一区二区三区 | av小次郎收藏 | 亚洲国产精品久久久久久 | 国产精品亚洲一区二区三区喷水 | 国产精品久久久久久久影院 | а√资源新版在线天堂 | 无码一区二区三区在线 | 欧美日韩亚洲国产精品 | 国产97在线 | 亚洲 | 日日摸夜夜摸狠狠摸婷婷 | 欧美喷潮久久久xxxxx | 国产卡一卡二卡三 | 人人澡人人妻人人爽人人蜜桃 | 狠狠色色综合网站 | 亚洲自偷自偷在线制服 | 亚洲欧美综合区丁香五月小说 | 在线成人www免费观看视频 | 精品厕所偷拍各类美女tp嘘嘘 | 婷婷五月综合缴情在线视频 | 特大黑人娇小亚洲女 | 久久99久久99精品中文字幕 | 国产xxx69麻豆国语对白 | 国产色在线 | 国产 | 伊人久久婷婷五月综合97色 | 国内精品久久久久久中文字幕 | 成人综合网亚洲伊人 | 国产精品亚洲专区无码不卡 | 色综合久久久无码网中文 | 国产精品永久免费视频 | 日本va欧美va欧美va精品 | 国产乡下妇女做爰 | 亚洲精品一区三区三区在线观看 | 亚洲国产日韩a在线播放 | 国产一区二区不卡老阿姨 | 老子影院午夜伦不卡 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲中文字幕无码中文字在线 | 动漫av一区二区在线观看 | 男人和女人高潮免费网站 | 少妇厨房愉情理9仑片视频 | 亚洲精品久久久久久久久久久 | 国产肉丝袜在线观看 | 熟妇人妻中文av无码 | 少妇被黑人到高潮喷出白浆 | 国产绳艺sm调教室论坛 | 亚洲中文字幕乱码av波多ji | 99久久亚洲精品无码毛片 | 日韩亚洲欧美中文高清在线 | 亚洲精品午夜无码电影网 | 中文精品无码中文字幕无码专区 | 波多野结衣一区二区三区av免费 | 在线 国产 欧美 亚洲 天堂 | 妺妺窝人体色www婷婷 | 秋霞成人午夜鲁丝一区二区三区 | 国产口爆吞精在线视频 | 天天躁夜夜躁狠狠是什么心态 | 极品尤物被啪到呻吟喷水 | 国产精品爱久久久久久久 | 4hu四虎永久在线观看 | 成人欧美一区二区三区黑人 | 亚洲精品鲁一鲁一区二区三区 | 无码人妻出轨黑人中文字幕 | 久久久精品国产sm最大网站 | 日韩欧美群交p片內射中文 | 在教室伦流澡到高潮hnp视频 | 人妻有码中文字幕在线 | 日本www一道久久久免费榴莲 | 国产超碰人人爽人人做人人添 | 久久精品无码一区二区三区 | 午夜成人1000部免费视频 | 色综合久久久久综合一本到桃花网 | 少妇性俱乐部纵欲狂欢电影 | 国产肉丝袜在线观看 | 久久99国产综合精品 | 老熟妇乱子伦牲交视频 | 永久免费观看美女裸体的网站 | 日韩av激情在线观看 | 亚洲精品一区三区三区在线观看 | 青草青草久热国产精品 | 男女下面进入的视频免费午夜 | 国内精品久久毛片一区二区 | 夜精品a片一区二区三区无码白浆 | 成人欧美一区二区三区黑人 | 亚洲精品成人av在线 | 亚洲一区二区三区偷拍女厕 | 国产成人精品视频ⅴa片软件竹菊 | 成人无码精品一区二区三区 | 国产美女极度色诱视频www | 成人欧美一区二区三区 | 国产三级久久久精品麻豆三级 | 精品国产一区二区三区四区 | 欧美日韩久久久精品a片 | 国产亚洲精品久久久久久国模美 | 国产av无码专区亚洲a∨毛片 | 国产办公室秘书无码精品99 | 精品国产一区二区三区四区在线看 | 97夜夜澡人人爽人人喊中国片 | 青春草在线视频免费观看 | 野外少妇愉情中文字幕 | 国产色精品久久人妻 | 中文字幕无码热在线视频 | 少妇厨房愉情理9仑片视频 | 一本大道久久东京热无码av | 初尝人妻少妇中文字幕 | 国产美女极度色诱视频www | 欧美 日韩 人妻 高清 中文 | 天堂无码人妻精品一区二区三区 | 亚洲日本一区二区三区在线 | 欧美国产日产一区二区 | 国产两女互慰高潮视频在线观看 | 大肉大捧一进一出好爽视频 | 亚洲精品一区二区三区大桥未久 | 色妞www精品免费视频 | 成人免费视频视频在线观看 免费 | 国产片av国语在线观看 | 无码吃奶揉捏奶头高潮视频 | 又大又硬又爽免费视频 | yw尤物av无码国产在线观看 | 无码一区二区三区在线观看 | 国产suv精品一区二区五 | 九九久久精品国产免费看小说 | 国产精品久久久av久久久 | 亚洲日韩精品欧美一区二区 | 精品少妇爆乳无码av无码专区 | 中文字幕av伊人av无码av | 日韩欧美中文字幕在线三区 | 麻豆国产人妻欲求不满谁演的 | 人妻中文无码久热丝袜 | 黑人玩弄人妻中文在线 | 一个人看的www免费视频在线观看 | 高中生自慰www网站 | 色五月五月丁香亚洲综合网 | 欧美老熟妇乱xxxxx | 久久久精品成人免费观看 | 人妻少妇精品无码专区二区 | 亚洲中文字幕av在天堂 | 水蜜桃亚洲一二三四在线 | 给我免费的视频在线观看 | 内射巨臀欧美在线视频 | 国产一区二区三区精品视频 | 国产精品免费大片 | 人妻天天爽夜夜爽一区二区 | 天天躁夜夜躁狠狠是什么心态 | 亚洲国产综合无码一区 | 丝袜人妻一区二区三区 | 熟女俱乐部五十路六十路av | 日本免费一区二区三区最新 | 国产无遮挡又黄又爽又色 | 人人妻人人澡人人爽欧美一区 | 2019nv天堂香蕉在线观看 | 玩弄人妻少妇500系列视频 | 欧美高清在线精品一区 | 国产午夜无码精品免费看 | 老熟妇仑乱视频一区二区 | 久久国产自偷自偷免费一区调 | 丰满人妻精品国产99aⅴ | 日本一卡2卡3卡四卡精品网站 | 久久久久国色av免费观看性色 | 日本大香伊一区二区三区 | 性色av无码免费一区二区三区 | 九九综合va免费看 | 精品乱码久久久久久久 | 久久精品国产精品国产精品污 | 久久精品国产日本波多野结衣 | av无码不卡在线观看免费 | 午夜精品久久久久久久 | 丰满少妇人妻久久久久久 | 欧美精品免费观看二区 | 欧洲精品码一区二区三区免费看 | 日韩精品无码一本二本三本色 | 亚洲色www成人永久网址 | 中文亚洲成a人片在线观看 | 亚洲人成无码网www | 亚洲一区二区三区国产精华液 | 午夜福利电影 | 粗大的内捧猛烈进出视频 | 欧美一区二区三区视频在线观看 | 国产一区二区三区影院 | 亚洲精品美女久久久久久久 | 欧美人妻一区二区三区 | 狠狠综合久久久久综合网 | 国产手机在线αⅴ片无码观看 | 亚洲爆乳精品无码一区二区三区 | 日日摸天天摸爽爽狠狠97 | 奇米影视7777久久精品 | 日本成熟视频免费视频 | 野狼第一精品社区 | 伊人久久大香线蕉午夜 | 国产亚洲精品久久久久久大师 | 欧洲美熟女乱又伦 | 又大又硬又爽免费视频 | 黑人巨大精品欧美一区二区 | 美女极度色诱视频国产 | 国产精品igao视频网 | 四虎影视成人永久免费观看视频 | 国产人妻精品午夜福利免费 | 精品 日韩 国产 欧美 视频 | 性欧美大战久久久久久久 | 水蜜桃色314在线观看 | 亚洲日韩一区二区 | 老头边吃奶边弄进去呻吟 | 天堂а√在线地址中文在线 | 国内丰满熟女出轨videos | 免费中文字幕日韩欧美 | 亚洲阿v天堂在线 | 奇米影视888欧美在线观看 | 国产两女互慰高潮视频在线观看 | 欧美性猛交xxxx富婆 | 国产av无码专区亚洲awww | 九九热爱视频精品 | 天天躁夜夜躁狠狠是什么心态 | 永久免费精品精品永久-夜色 | 亚洲精品久久久久久一区二区 | 丝袜 中出 制服 人妻 美腿 | 精品偷拍一区二区三区在线看 | 在线 国产 欧美 亚洲 天堂 | 性欧美videos高清精品 | 精品无码av一区二区三区 | 国产电影无码午夜在线播放 | 亚洲无人区一区二区三区 | 老子影院午夜伦不卡 | 国产特级毛片aaaaaa高潮流水 | 丰满少妇高潮惨叫视频 | 国产精品.xx视频.xxtv | 美女毛片一区二区三区四区 | 国产av人人夜夜澡人人爽麻豆 | 午夜理论片yy44880影院 | 婷婷丁香五月天综合东京热 | 最近的中文字幕在线看视频 | 久久亚洲精品中文字幕无男同 | 久久久婷婷五月亚洲97号色 | 久久精品国产日本波多野结衣 | 国产性生大片免费观看性 | 在线欧美精品一区二区三区 | 丰满人妻精品国产99aⅴ | 国产区女主播在线观看 | 亚洲精品一区三区三区在线观看 | 亲嘴扒胸摸屁股激烈网站 | 人妻少妇被猛烈进入中文字幕 | 国内综合精品午夜久久资源 | 久久精品女人天堂av免费观看 | 九月婷婷人人澡人人添人人爽 | 亚洲欧美国产精品专区久久 | 日韩精品a片一区二区三区妖精 | 一本久道久久综合婷婷五月 | 成人亚洲精品久久久久软件 | 久9re热视频这里只有精品 | 四虎国产精品一区二区 | 日韩视频 中文字幕 视频一区 | 熟妇人妻无乱码中文字幕 | 欧美日韩一区二区免费视频 | 精品久久久久久人妻无码中文字幕 | 久久精品国产99精品亚洲 | 色综合久久久无码中文字幕 | 久久精品国产99精品亚洲 | а√资源新版在线天堂 | 乱人伦人妻中文字幕无码 | 亚洲国产精品一区二区美利坚 | 东京热无码av男人的天堂 | 亚洲熟熟妇xxxx | 无码中文字幕色专区 | 永久免费观看国产裸体美女 | 人人超人人超碰超国产 | 久久精品一区二区三区四区 | 国产在线精品一区二区三区直播 | 兔费看少妇性l交大片免费 | 欧美日韩综合一区二区三区 | 亚洲色偷偷男人的天堂 | 荫蒂被男人添的好舒服爽免费视频 | 99精品无人区乱码1区2区3区 | 国产精品人人妻人人爽 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 99久久婷婷国产综合精品青草免费 | 少妇无码一区二区二三区 | www一区二区www免费 | 婷婷综合久久中文字幕蜜桃三电影 | 国产精品丝袜黑色高跟鞋 | 曰韩无码二三区中文字幕 | 国产国语老龄妇女a片 | 久久久久久久人妻无码中文字幕爆 | 久久99久久99精品中文字幕 | 成 人 免费观看网站 | 99久久人妻精品免费二区 | 图片区 小说区 区 亚洲五月 | 天天做天天爱天天爽综合网 | 99久久婷婷国产综合精品青草免费 | 又粗又大又硬又长又爽 | 无码人妻出轨黑人中文字幕 | 久久综合香蕉国产蜜臀av | 亚洲成av人片在线观看无码不卡 | 色一情一乱一伦一区二区三欧美 | 学生妹亚洲一区二区 | 三上悠亚人妻中文字幕在线 | 人妻少妇精品无码专区二区 | 无码精品国产va在线观看dvd | 鲁鲁鲁爽爽爽在线视频观看 | 国产午夜亚洲精品不卡下载 | 性色av无码免费一区二区三区 | 亚洲人成人无码网www国产 | 巨爆乳无码视频在线观看 | 图片小说视频一区二区 | 无码国产激情在线观看 | 精品亚洲韩国一区二区三区 | 人人澡人人透人人爽 | 国产av一区二区精品久久凹凸 | 西西人体www44rt大胆高清 | 精品国产aⅴ无码一区二区 | 久久精品人妻少妇一区二区三区 | 午夜免费福利小电影 | 欧美性生交活xxxxxdddd | 亚洲午夜福利在线观看 | 欧美精品无码一区二区三区 | 亚洲精品午夜国产va久久成人 | 精品久久久中文字幕人妻 | 久久国产精品二国产精品 | 日本一区二区三区免费播放 | 图片区 小说区 区 亚洲五月 | 国产精品人妻一区二区三区四 | 荫蒂添的好舒服视频囗交 | 人妻少妇精品无码专区动漫 | 亚洲综合另类小说色区 | 永久黄网站色视频免费直播 | 色欲久久久天天天综合网精品 | 日产精品99久久久久久 | 乱人伦人妻中文字幕无码 | 人人妻人人澡人人爽精品欧美 | 午夜福利不卡在线视频 | 亚洲成在人网站无码天堂 | 色窝窝无码一区二区三区色欲 | 呦交小u女精品视频 | 久久99精品久久久久久动态图 | 中文字幕av日韩精品一区二区 | 六月丁香婷婷色狠狠久久 | 偷窥日本少妇撒尿chinese | 亚洲第一无码av无码专区 | 麻花豆传媒剧国产免费mv在线 | 四虎国产精品一区二区 | 色情久久久av熟女人妻网站 | 国产精品成人av在线观看 | 亚洲日本va中文字幕 | 97精品国产97久久久久久免费 | 在线观看免费人成视频 | 久久99精品国产麻豆蜜芽 | 精品久久综合1区2区3区激情 | 六月丁香婷婷色狠狠久久 | 丰满人妻精品国产99aⅴ | 国产精品亚洲一区二区三区喷水 | 国产猛烈高潮尖叫视频免费 | 一本无码人妻在中文字幕免费 | 亚洲综合久久一区二区 | 国产亚洲欧美日韩亚洲中文色 | 亚洲中文字幕久久无码 | 国产亚洲精品久久久ai换 | 丝袜 中出 制服 人妻 美腿 | 蜜桃臀无码内射一区二区三区 | 国产亚洲欧美日韩亚洲中文色 | 男女下面进入的视频免费午夜 | 性生交大片免费看女人按摩摩 | 无码av岛国片在线播放 | 亚洲欧美中文字幕5发布 | 国产 浪潮av性色四虎 | 真人与拘做受免费视频一 | 丰满人妻一区二区三区免费视频 | 一本久道久久综合狠狠爱 | 高中生自慰www网站 | 亚洲精品美女久久久久久久 | 国产内射爽爽大片视频社区在线 | 日本爽爽爽爽爽爽在线观看免 | 国产超碰人人爽人人做人人添 | 亚洲一区二区三区含羞草 | 好爽又高潮了毛片免费下载 | 永久免费精品精品永久-夜色 | 一本久久伊人热热精品中文字幕 | 久久亚洲精品中文字幕无男同 | 国产精华av午夜在线观看 | 久久综合激激的五月天 | 性啪啪chinese东北女人 | 久久精品国产99久久6动漫 | 欧美人与物videos另类 | 97精品人妻一区二区三区香蕉 | 日本熟妇大屁股人妻 | 国产人成高清在线视频99最全资源 | 亚洲 a v无 码免 费 成 人 a v | 三上悠亚人妻中文字幕在线 | 无码中文字幕色专区 | 奇米影视888欧美在线观看 | 国产肉丝袜在线观看 | 欧美激情综合亚洲一二区 | 亚洲欧美色中文字幕在线 | 少妇性荡欲午夜性开放视频剧场 | 国产高清不卡无码视频 | 女高中生第一次破苞av | 亚洲狠狠色丁香婷婷综合 | 亚洲精品中文字幕 | 高清国产亚洲精品自在久久 | 国产无遮挡又黄又爽免费视频 | 对白脏话肉麻粗话av | 99精品视频在线观看免费 | 黑森林福利视频导航 | 亚洲自偷精品视频自拍 | 四虎国产精品免费久久 | 久久精品国产大片免费观看 | 人妻aⅴ无码一区二区三区 | 无码人妻丰满熟妇区毛片18 | 国产内射爽爽大片视频社区在线 | 奇米影视7777久久精品 | 狠狠cao日日穞夜夜穞av | 蜜臀av在线观看 在线欧美精品一区二区三区 | 国产成人人人97超碰超爽8 | 国产成人无码av片在线观看不卡 | 国产人成高清在线视频99最全资源 | 亚洲区小说区激情区图片区 | 欧美日本精品一区二区三区 | 午夜精品久久久内射近拍高清 | 国产超级va在线观看视频 | 中文字幕无码热在线视频 | 日产精品99久久久久久 | 一区二区传媒有限公司 | 自拍偷自拍亚洲精品被多人伦好爽 | 日日干夜夜干 | 荫蒂被男人添的好舒服爽免费视频 | 无码国内精品人妻少妇 | 国产无套内射久久久国产 | 76少妇精品导航 | 天天躁日日躁狠狠躁免费麻豆 | 国产精品.xx视频.xxtv | 亚洲一区二区三区国产精华液 | 国产精品成人av在线观看 | 久久www免费人成人片 | 欧美人与牲动交xxxx | 大肉大捧一进一出好爽视频 | 国产乱人伦av在线无码 | 亚洲无人区午夜福利码高清完整版 | 天堂在线观看www | 一区二区三区高清视频一 | 少妇无码一区二区二三区 | 大肉大捧一进一出好爽视频 | 欧美性猛交内射兽交老熟妇 | 乱人伦人妻中文字幕无码久久网 | 久久综合网欧美色妞网 | 粉嫩少妇内射浓精videos | 300部国产真实乱 | 久久综合给久久狠狠97色 | 51国偷自产一区二区三区 | 亚洲一区二区三区在线观看网站 | 国产av剧情md精品麻豆 | 天天拍夜夜添久久精品 | 无套内谢老熟女 | 小鲜肉自慰网站xnxx | 嫩b人妻精品一区二区三区 | 久久天天躁夜夜躁狠狠 | 国产精品久久久久无码av色戒 | 无遮挡国产高潮视频免费观看 | 国产成人无码av在线影院 | 牲交欧美兽交欧美 | 亚洲狠狠婷婷综合久久 | 精品国产一区二区三区四区在线看 | 毛片内射-百度 | 亚洲国产日韩a在线播放 | 亚洲狠狠色丁香婷婷综合 | 成人无码视频在线观看网站 | 九一九色国产 | 男人的天堂2018无码 | 一本大道久久东京热无码av | 草草网站影院白丝内射 | 国产亚洲精品精品国产亚洲综合 | 中文字幕乱妇无码av在线 | 久久99久久99精品中文字幕 | 欧美黑人性暴力猛交喷水 | 在线精品国产一区二区三区 | 欧美丰满熟妇xxxx性ppx人交 | 亚洲国产av美女网站 | 99久久久无码国产精品免费 | 纯爱无遮挡h肉动漫在线播放 | 九九久久精品国产免费看小说 | 亚洲欧洲日本无在线码 | 国内老熟妇对白xxxxhd | 国产午夜亚洲精品不卡下载 | 午夜熟女插插xx免费视频 | 在线播放亚洲第一字幕 | 国产精品久久久av久久久 | 亚洲精品一区二区三区大桥未久 | 全黄性性激高免费视频 | 亚洲成av人影院在线观看 | 红桃av一区二区三区在线无码av | 一本久久a久久精品亚洲 | 丰满少妇高潮惨叫视频 | 亚洲中文字幕无码中字 | 免费人成网站视频在线观看 | 精品人妻人人做人人爽 | 国产亚洲精品精品国产亚洲综合 | 欧洲精品码一区二区三区免费看 | 未满小14洗澡无码视频网站 | 免费观看激色视频网站 | 天堂а√在线地址中文在线 | 国产极品视觉盛宴 | 亚洲成熟女人毛毛耸耸多 | 亚洲va中文字幕无码久久不卡 | 亚洲精品一区国产 | 精品少妇爆乳无码av无码专区 | 成人精品一区二区三区中文字幕 | 久久伊人色av天堂九九小黄鸭 | 图片区 小说区 区 亚洲五月 | 免费无码午夜福利片69 | 牲欲强的熟妇农村老妇女 | 日韩精品a片一区二区三区妖精 | 国产成人精品无码播放 | 久久久久久国产精品无码下载 | 久久精品国产一区二区三区肥胖 | 免费男性肉肉影院 | 天下第一社区视频www日本 | 成熟人妻av无码专区 | 久久99国产综合精品 | 国产精品美女久久久久av爽李琼 | 精品 日韩 国产 欧美 视频 | 77777熟女视频在线观看 а天堂中文在线官网 | 久久伊人色av天堂九九小黄鸭 | 人妻无码αv中文字幕久久琪琪布 | 精品国产国产综合精品 | 97夜夜澡人人双人人人喊 | 日本精品高清一区二区 | 色老头在线一区二区三区 | 国产亚洲日韩欧美另类第八页 | 免费国产黄网站在线观看 | 久久久精品成人免费观看 | 久久久精品456亚洲影院 | 少妇性l交大片欧洲热妇乱xxx | 少妇厨房愉情理9仑片视频 | 国内少妇偷人精品视频免费 | 国产精品第一国产精品 | 日日碰狠狠躁久久躁蜜桃 | 国语精品一区二区三区 | 久久久久av无码免费网 | 四虎影视成人永久免费观看视频 | 国产精品视频免费播放 | 无码国产乱人伦偷精品视频 | 成年美女黄网站色大免费全看 | 精品无码一区二区三区爱欲 | 无码av免费一区二区三区试看 | 老司机亚洲精品影院无码 | 99国产欧美久久久精品 | 人妻少妇精品无码专区动漫 | 国产亚洲精品久久久久久大师 | 欧美高清在线精品一区 | 欧美黑人性暴力猛交喷水 | 色综合视频一区二区三区 | 十八禁真人啪啪免费网站 | 日本精品人妻无码77777 天堂一区人妻无码 | 东京热无码av男人的天堂 | 精品国产国产综合精品 | 亚洲va欧美va天堂v国产综合 | 国产成人精品一区二区在线小狼 | 国产亚洲欧美在线专区 | 亚洲精品午夜无码电影网 | 1000部啪啪未满十八勿入下载 | 未满小14洗澡无码视频网站 | 久久无码中文字幕免费影院蜜桃 | 亚洲精品综合五月久久小说 | 欧美色就是色 | 人人妻人人澡人人爽人人精品浪潮 | 国产精品永久免费视频 | 中文字幕av伊人av无码av | 色一情一乱一伦一视频免费看 | 国产无遮挡吃胸膜奶免费看 | 亚洲色欲色欲欲www在线 | 2020最新国产自产精品 | 日韩成人一区二区三区在线观看 | 国产色在线 | 国产 | 2019午夜福利不卡片在线 | 成人一区二区免费视频 | 精品一二三区久久aaa片 | 国产精品久免费的黄网站 | 国内揄拍国内精品人妻 | 亚洲精品国产品国语在线观看 | 亚洲色成人中文字幕网站 | 无码播放一区二区三区 | 国产成人一区二区三区别 | 亚洲欧美精品aaaaaa片 | 好爽又高潮了毛片免费下载 | 亚洲精品久久久久中文第一幕 | 日本精品高清一区二区 | 亚洲国产精品一区二区第一页 | 水蜜桃亚洲一二三四在线 | 欧美丰满熟妇xxxx性ppx人交 | 国产精品久久久久久亚洲影视内衣 | 亚洲热妇无码av在线播放 | 欧洲vodafone精品性 | 沈阳熟女露脸对白视频 | 正在播放东北夫妻内射 | 国产精品亚洲专区无码不卡 | 国产色在线 | 国产 | 午夜嘿嘿嘿影院 | 国产网红无码精品视频 | 99国产精品白浆在线观看免费 | 亚洲精品中文字幕久久久久 | 中文久久乱码一区二区 | 亚洲精品一区二区三区四区五区 | 性做久久久久久久久 | 日本一卡2卡3卡四卡精品网站 | 国产真实夫妇视频 | 久久久精品欧美一区二区免费 | 露脸叫床粗话东北少妇 | 国产美女极度色诱视频www | 人妻与老人中文字幕 | 欧美丰满老熟妇xxxxx性 | 久久午夜无码鲁丝片午夜精品 | 九九久久精品国产免费看小说 | 精品乱子伦一区二区三区 | 欧美freesex黑人又粗又大 | 4hu四虎永久在线观看 | 精品少妇爆乳无码av无码专区 | 久青草影院在线观看国产 | 国产莉萝无码av在线播放 | 久9re热视频这里只有精品 | 呦交小u女精品视频 | а√资源新版在线天堂 | 福利一区二区三区视频在线观看 | 国产精品久久久久久亚洲毛片 | 国产人妖乱国产精品人妖 | 伊人久久大香线蕉亚洲 | 美女扒开屁股让男人桶 | 亚洲 a v无 码免 费 成 人 a v | 真人与拘做受免费视频一 | 青青草原综合久久大伊人精品 | 人妻体内射精一区二区三四 | 久久www免费人成人片 | 久久国语露脸国产精品电影 | 精品国产青草久久久久福利 | 狠狠色欧美亚洲狠狠色www | 国产无套内射久久久国产 | 国产亚av手机在线观看 | 精品久久综合1区2区3区激情 | 国产精品久久久久久亚洲毛片 | 久久精品成人欧美大片 | 无码播放一区二区三区 | 亚洲一区二区三区含羞草 | 午夜精品久久久内射近拍高清 | 亚洲人成影院在线无码按摩店 | 亚洲码国产精品高潮在线 | 中国女人内谢69xxxx | 性欧美牲交在线视频 | 少妇激情av一区二区 | 亚洲中文字幕乱码av波多ji | 伊在人天堂亚洲香蕉精品区 | 久久国产自偷自偷免费一区调 | 无码人妻久久一区二区三区不卡 | 久久人人爽人人爽人人片av高清 | 亚洲娇小与黑人巨大交 | 亚洲熟妇色xxxxx欧美老妇 | 亚洲国产精品成人久久蜜臀 | 国产成人精品一区二区在线小狼 | 国产超级va在线观看视频 | 国产成人无码av片在线观看不卡 | 日韩精品无码一本二本三本色 | 男女性色大片免费网站 | 欧美熟妇另类久久久久久不卡 | 国产精品无码永久免费888 | 波多野结衣高清一区二区三区 | 亚洲の无码国产の无码影院 | 99久久精品无码一区二区毛片 | 国产精品爱久久久久久久 | 日日碰狠狠丁香久燥 | 亚洲色大成网站www国产 | 成人亚洲精品久久久久软件 | 亚洲成在人网站无码天堂 | 中文字幕精品av一区二区五区 | 老子影院午夜伦不卡 | 亚洲人成网站色7799 | 久久精品人人做人人综合试看 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 又色又爽又黄的美女裸体网站 | 午夜性刺激在线视频免费 | 熟女少妇在线视频播放 | 午夜肉伦伦影院 | av小次郎收藏 | 国产av剧情md精品麻豆 | 亚洲日韩av片在线观看 | 国产精品久久久久影院嫩草 | 东京热男人av天堂 | 国产黑色丝袜在线播放 | 免费无码午夜福利片69 | 男人和女人高潮免费网站 | 俄罗斯老熟妇色xxxx | 亚洲熟妇色xxxxx欧美老妇 | 成人无码视频免费播放 | 一本久道久久综合狠狠爱 | 97无码免费人妻超级碰碰夜夜 | 撕开奶罩揉吮奶头视频 | 久久无码人妻影院 | 亚洲日本在线电影 | 漂亮人妻洗澡被公强 日日躁 | 中文字幕乱妇无码av在线 | 日本一区二区三区免费高清 | 性史性农村dvd毛片 | 秋霞特色aa大片 | 婷婷五月综合缴情在线视频 | 国产激情综合五月久久 | 国产精品久久国产精品99 | 性欧美牲交xxxxx视频 | 鲁大师影院在线观看 | 亚洲成av人片天堂网无码】 | 97夜夜澡人人爽人人喊中国片 | 无码人妻久久一区二区三区不卡 | 精品午夜福利在线观看 | 午夜精品久久久久久久久 | av无码久久久久不卡免费网站 | 久9re热视频这里只有精品 | av香港经典三级级 在线 | 丰满人妻精品国产99aⅴ | 老熟妇乱子伦牲交视频 | 67194成是人免费无码 | 久久亚洲中文字幕无码 | 一本色道婷婷久久欧美 | 午夜福利试看120秒体验区 | 岛国片人妻三上悠亚 | 久久午夜无码鲁丝片午夜精品 | 一本一道久久综合久久 | 国产午夜福利100集发布 | 激情五月综合色婷婷一区二区 | 亚洲欧洲无卡二区视頻 | 久久精品人妻少妇一区二区三区 | 一区二区三区乱码在线 | 欧洲 | 国产激情无码一区二区app | 熟妇女人妻丰满少妇中文字幕 | 在线亚洲高清揄拍自拍一品区 | 国内少妇偷人精品视频免费 | 精品 日韩 国产 欧美 视频 | 国产午夜视频在线观看 | 国产精品人人妻人人爽 | 亚洲伊人久久精品影院 | 久久99久久99精品中文字幕 | 东京热一精品无码av | 久久99精品国产麻豆 | 天天拍夜夜添久久精品大 | 成 人 网 站国产免费观看 | 亚洲七七久久桃花影院 | 亚洲区欧美区综合区自拍区 | 国模大胆一区二区三区 | 黑人大群体交免费视频 | 无码任你躁久久久久久久 | 玩弄中年熟妇正在播放 | 在教室伦流澡到高潮hnp视频 | 国产乱码精品一品二品 | 爆乳一区二区三区无码 | 日本大乳高潮视频在线观看 | 3d动漫精品啪啪一区二区中 | 宝宝好涨水快流出来免费视频 | 欧美野外疯狂做受xxxx高潮 | 久久久久成人精品免费播放动漫 | 一本久久伊人热热精品中文字幕 | 欧美精品国产综合久久 | 亚洲一区二区三区偷拍女厕 | 国产无遮挡吃胸膜奶免费看 | 欧美日韩视频无码一区二区三 | 丝袜人妻一区二区三区 | 欧美熟妇另类久久久久久不卡 | 亲嘴扒胸摸屁股激烈网站 | 小鲜肉自慰网站xnxx | 99久久人妻精品免费一区 | 色综合天天综合狠狠爱 | a在线亚洲男人的天堂 | 熟妇女人妻丰满少妇中文字幕 | 亚洲欧美中文字幕5发布 | 免费无码av一区二区 | 国产九九九九九九九a片 | 99精品视频在线观看免费 | 一本无码人妻在中文字幕免费 | 六月丁香婷婷色狠狠久久 | 久久精品一区二区三区四区 | 久久综合给久久狠狠97色 | 精品国产精品久久一区免费式 | 人妻少妇精品无码专区二区 | 18黄暴禁片在线观看 | 亚洲熟女一区二区三区 | 国产一区二区三区影院 | 久久久久av无码免费网 | 99久久人妻精品免费一区 | 亚洲国产精华液网站w | 自拍偷自拍亚洲精品被多人伦好爽 | a国产一区二区免费入口 | 少妇一晚三次一区二区三区 | 麻豆av传媒蜜桃天美传媒 | 亚洲aⅴ无码成人网站国产app | 精品国产av色一区二区深夜久久 | 国产色在线 | 国产 | 中文字幕 人妻熟女 | 婷婷五月综合缴情在线视频 | 亚洲成a人片在线观看日本 | 四虎国产精品免费久久 | 99re在线播放 | 激情爆乳一区二区三区 | 国产精品内射视频免费 | 无码福利日韩神码福利片 | 人妻少妇被猛烈进入中文字幕 | 国产办公室秘书无码精品99 | 蜜桃无码一区二区三区 | 一二三四社区在线中文视频 | 欧美人妻一区二区三区 | 亚洲自偷精品视频自拍 | 久久精品女人的天堂av | 成人免费视频视频在线观看 免费 | 色综合视频一区二区三区 | 人人妻在人人 | 亚洲成av人片天堂网无码】 | 天天拍夜夜添久久精品 | av无码电影一区二区三区 | 国产九九九九九九九a片 | 久久婷婷五月综合色国产香蕉 | 999久久久国产精品消防器材 | 亚洲第一网站男人都懂 | 日本护士毛茸茸高潮 | 在线天堂新版最新版在线8 | v一区无码内射国产 | 亚洲中文无码av永久不收费 | 久久99久久99精品中文字幕 | 亚洲热妇无码av在线播放 | av在线亚洲欧洲日产一区二区 | 国产精品亚洲lv粉色 | 免费无码肉片在线观看 | 欧美老熟妇乱xxxxx | 国产麻豆精品精东影业av网站 | 成人免费视频一区二区 | 一本无码人妻在中文字幕免费 | 欧美日韩一区二区三区自拍 | 国产午夜无码精品免费看 | 精品亚洲成av人在线观看 | 日本高清一区免费中文视频 | 天海翼激烈高潮到腰振不止 | 日韩av无码一区二区三区 | 在线欧美精品一区二区三区 | 欧美人妻一区二区三区 | 夜夜高潮次次欢爽av女 | 国产成人无码a区在线观看视频app | 女高中生第一次破苞av | 一本色道婷婷久久欧美 | 亚洲国产欧美日韩精品一区二区三区 | 免费人成在线观看网站 | 亚洲伊人久久精品影院 | 装睡被陌生人摸出水好爽 | 高清国产亚洲精品自在久久 | 亚洲一区二区三区四区 | 午夜丰满少妇性开放视频 | 成人试看120秒体验区 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲另类伦春色综合小说 | 日日摸天天摸爽爽狠狠97 | 国产激情精品一区二区三区 | 2020久久香蕉国产线看观看 | 无码国模国产在线观看 | 亚洲娇小与黑人巨大交 | 国产激情综合五月久久 | 亚洲精品午夜无码电影网 | www国产亚洲精品久久久日本 | 亚洲欧洲日本综合aⅴ在线 | 2020久久香蕉国产线看观看 | 97精品国产97久久久久久免费 | 国产艳妇av在线观看果冻传媒 | 国产免费久久精品国产传媒 | 麻豆国产丝袜白领秘书在线观看 | 麻豆成人精品国产免费 | www成人国产高清内射 | 中文字幕人成乱码熟女app | 成人无码视频在线观看网站 | 俺去俺来也www色官网 | 亚洲成色在线综合网站 | 又大又紧又粉嫩18p少妇 | 亚洲成a人片在线观看无码 | 免费看男女做好爽好硬视频 | 亚洲日韩精品欧美一区二区 | 亚洲色成人中文字幕网站 | 国产精品人人爽人人做我的可爱 | 久久久久久久人妻无码中文字幕爆 | 午夜精品久久久内射近拍高清 | 国产成人久久精品流白浆 | 欧美熟妇另类久久久久久多毛 | 国产黄在线观看免费观看不卡 | 纯爱无遮挡h肉动漫在线播放 | 精品一二三区久久aaa片 | 亚洲欧美日韩综合久久久 | 国产av久久久久精东av | 中文字幕久久久久人妻 | 亚洲中文字幕在线观看 | 国产免费无码一区二区视频 | 男女爱爱好爽视频免费看 | 亚洲日韩一区二区 | 粗大的内捧猛烈进出视频 | 亚洲中文字幕在线观看 | 学生妹亚洲一区二区 | 亚洲va中文字幕无码久久不卡 | 国产亚av手机在线观看 | 国产亚洲视频中文字幕97精品 | 窝窝午夜理论片影院 | 狠狠色丁香久久婷婷综合五月 | www国产亚洲精品久久网站 | 国产黄在线观看免费观看不卡 | 任你躁国产自任一区二区三区 | 亚洲爆乳大丰满无码专区 | 国产精品手机免费 | 人妻体内射精一区二区三四 | 亚洲日韩乱码中文无码蜜桃臀网站 | 中文字幕无线码免费人妻 | 亚洲成a人片在线观看无码3d | 97精品国产97久久久久久免费 | 丝袜人妻一区二区三区 | 亚洲国产午夜精品理论片 | 红桃av一区二区三区在线无码av | 午夜熟女插插xx免费视频 | 中文字幕人妻无码一夲道 | 丰满少妇弄高潮了www | 免费观看又污又黄的网站 | 亚洲日韩一区二区 | 熟妇人妻无乱码中文字幕 | 亚洲欧美日韩国产精品一区二区 | 国产真实乱对白精彩久久 | 男人和女人高潮免费网站 | 成人综合网亚洲伊人 | 白嫩日本少妇做爰 | 国产乱人偷精品人妻a片 | 免费无码的av片在线观看 | 国产尤物精品视频 | 丰满少妇高潮惨叫视频 | 少妇愉情理伦片bd | 国产免费观看黄av片 | 99久久久国产精品无码免费 | 亚洲国产av精品一区二区蜜芽 | 女人被男人爽到呻吟的视频 | 久久精品视频在线看15 | 亚洲午夜久久久影院 | 天天拍夜夜添久久精品大 | 日韩 欧美 动漫 国产 制服 | 97久久超碰中文字幕 | 国产精品多人p群无码 | 无码纯肉视频在线观看 | 精品夜夜澡人妻无码av蜜桃 | 久久天天躁狠狠躁夜夜免费观看 | 日日天干夜夜狠狠爱 | av在线亚洲欧洲日产一区二区 | 久久午夜无码鲁丝片 | 亚洲成色在线综合网站 | 熟妇人妻中文av无码 | 成人精品一区二区三区中文字幕 | 在线精品国产一区二区三区 | 国产精品永久免费视频 | 永久黄网站色视频免费直播 | 久久伊人色av天堂九九小黄鸭 | 久久亚洲中文字幕无码 | 亚洲国产精品无码久久久久高潮 | 成人欧美一区二区三区黑人免费 | 男人扒开女人内裤强吻桶进去 | 97色伦图片97综合影院 | 伊人久久大香线焦av综合影院 | 国产偷国产偷精品高清尤物 | 国产麻豆精品精东影业av网站 | 精品成在人线av无码免费看 | 精品国产成人一区二区三区 | 国产精品-区区久久久狼 | 偷窥村妇洗澡毛毛多 | 久久久无码中文字幕久... | 国语精品一区二区三区 | 一区二区三区乱码在线 | 欧洲 | 国产色精品久久人妻 | 丰满人妻精品国产99aⅴ | 久久国语露脸国产精品电影 | 久久人人爽人人爽人人片av高清 | 久久精品国产一区二区三区肥胖 | 国产精品国产自线拍免费软件 | 美女毛片一区二区三区四区 | 成人一在线视频日韩国产 | 亚洲精品国产精品乱码视色 | 麻豆国产人妻欲求不满谁演的 | 日本精品久久久久中文字幕 | 国产熟女一区二区三区四区五区 | 精品久久综合1区2区3区激情 | 亚洲国产日韩a在线播放 | 欧美精品在线观看 | 在教室伦流澡到高潮hnp视频 | 夜夜高潮次次欢爽av女 | 一本久久a久久精品vr综合 | 强奷人妻日本中文字幕 | 国产人妻人伦精品 | 欧美老人巨大xxxx做受 | 国产性生交xxxxx无码 | 成人性做爰aaa片免费看不忠 | аⅴ资源天堂资源库在线 | 激情亚洲一区国产精品 | 狠狠噜狠狠狠狠丁香五月 | 国产xxx69麻豆国语对白 | 日本一区二区更新不卡 | 亚洲欧美中文字幕5发布 | 亚洲人亚洲人成电影网站色 | 亚洲一区二区三区含羞草 | 日韩少妇内射免费播放 | 亚洲码国产精品高潮在线 | 精品人妻人人做人人爽夜夜爽 | 国产综合色产在线精品 | 性色av无码免费一区二区三区 | 免费乱码人妻系列无码专区 | 美女黄网站人色视频免费国产 | 窝窝午夜理论片影院 | 欧美xxxx黑人又粗又长 | 少妇人妻偷人精品无码视频 | 亚洲精品国产精品乱码视色 | 老头边吃奶边弄进去呻吟 | 久久精品国产一区二区三区肥胖 | 日本护士xxxxhd少妇 | 夜先锋av资源网站 | 免费观看又污又黄的网站 | 亚洲中文字幕在线无码一区二区 | 在线观看欧美一区二区三区 | 国产麻豆精品一区二区三区v视界 | 天天爽夜夜爽夜夜爽 | 亚洲s码欧洲m码国产av | 99精品久久毛片a片 | 亚洲国产成人av在线观看 | 国产午夜福利亚洲第一 | 国产精品第一国产精品 | 性做久久久久久久久 | 日日天干夜夜狠狠爱 | 老熟妇乱子伦牲交视频 | 久久综合狠狠综合久久综合88 | 日本爽爽爽爽爽爽在线观看免 | 国产亚洲视频中文字幕97精品 | 天堂一区人妻无码 | 老司机亚洲精品影院无码 | 九一九色国产 | 理论片87福利理论电影 | 色综合久久久久综合一本到桃花网 | 一本加勒比波多野结衣 | 97久久超碰中文字幕 | 最近的中文字幕在线看视频 | 好男人www社区 | 日韩av无码中文无码电影 | 水蜜桃色314在线观看 | 亚洲男女内射在线播放 | 熟女少妇人妻中文字幕 | 99riav国产精品视频 | 精品人妻人人做人人爽 | 午夜理论片yy44880影院 | 日韩av无码一区二区三区 | 久久精品国产精品国产精品污 | 久久精品一区二区三区四区 | 一个人看的www免费视频在线观看 | 黑人大群体交免费视频 | 奇米影视888欧美在线观看 | 亚洲国产精品毛片av不卡在线 | 成人性做爰aaa片免费看 | 国内揄拍国内精品人妻 | 高清不卡一区二区三区 | 国产真人无遮挡作爱免费视频 | 欧美阿v高清资源不卡在线播放 | av无码电影一区二区三区 | 欧美 亚洲 国产 另类 | 国产人妻精品午夜福利免费 | 亚洲综合在线一区二区三区 | 久青草影院在线观看国产 | 久久天天躁夜夜躁狠狠 | 亚洲а∨天堂久久精品2021 | 狠狠色丁香久久婷婷综合五月 | 成人动漫在线观看 | 亚洲の无码国产の无码步美 | 99久久人妻精品免费一区 | 国产无遮挡又黄又爽又色 | 亚洲综合色区中文字幕 | 又大又黄又粗又爽的免费视频 | 国产人妖乱国产精品人妖 | 国产色精品久久人妻 | 三上悠亚人妻中文字幕在线 | 无码成人精品区在线观看 | 欧美国产日产一区二区 | 色婷婷av一区二区三区之红樱桃 | 天下第一社区视频www日本 | 2020最新国产自产精品 | 精品国产一区二区三区四区 | 国产精品丝袜黑色高跟鞋 | 国产小呦泬泬99精品 | 精品久久综合1区2区3区激情 | 免费观看黄网站 | 国产精品亚洲lv粉色 | 成人片黄网站色大片免费观看 | 狠狠噜狠狠狠狠丁香五月 | 日日橹狠狠爱欧美视频 | 亚洲自偷精品视频自拍 | 国产9 9在线 | 中文 | 最新国产乱人伦偷精品免费网站 | 无码成人精品区在线观看 | 丝袜美腿亚洲一区二区 | 一个人免费观看的www视频 | 久久精品人人做人人综合试看 | 乱码av麻豆丝袜熟女系列 | 精品国产青草久久久久福利 | 亚洲s色大片在线观看 | 思思久久99热只有频精品66 | 精品国产麻豆免费人成网站 | 特大黑人娇小亚洲女 | 亚洲日本一区二区三区在线 | 国产又粗又硬又大爽黄老大爷视 | 无码一区二区三区在线 | 日韩少妇内射免费播放 | 激情亚洲一区国产精品 | 中文字幕av伊人av无码av | 日本乱偷人妻中文字幕 | 精品人人妻人人澡人人爽人人 | 任你躁国产自任一区二区三区 | 国产福利视频一区二区 | 久久久久久久女国产乱让韩 | 蜜桃视频插满18在线观看 | 亚洲色欲久久久综合网东京热 | 思思久久99热只有频精品66 | 精品国产精品久久一区免费式 | 亚洲精品一区二区三区婷婷月 | 国产亚洲精品久久久久久 | 亚洲中文字幕在线无码一区二区 | 免费人成在线观看网站 | 丰满少妇熟乱xxxxx视频 | 高潮毛片无遮挡高清免费 | 亚洲综合无码一区二区三区 | 欧美人与禽猛交狂配 | 精品人人妻人人澡人人爽人人 | 国产成人精品无码播放 | 天天摸天天透天天添 | 中国女人内谢69xxxx | 亚洲乱码日产精品bd | 国产偷抇久久精品a片69 | 精品人妻人人做人人爽 | 十八禁视频网站在线观看 | √天堂中文官网8在线 | 国产香蕉97碰碰久久人人 | 天堂无码人妻精品一区二区三区 | 装睡被陌生人摸出水好爽 | 成人无码精品1区2区3区免费看 | 国产成人综合在线女婷五月99播放 | 国产口爆吞精在线视频 | www国产精品内射老师 | 欧美性生交活xxxxxdddd | 无码吃奶揉捏奶头高潮视频 | 国内少妇偷人精品视频免费 | 狠狠色色综合网站 | 麻花豆传媒剧国产免费mv在线 | aⅴ亚洲 日韩 色 图网站 播放 | 一本久道久久综合婷婷五月 | 人妻无码久久精品人妻 | 无码吃奶揉捏奶头高潮视频 | av香港经典三级级 在线 | 欧美 亚洲 国产 另类 | 国产黄在线观看免费观看不卡 | 特黄特色大片免费播放器图片 | 亚洲无人区午夜福利码高清完整版 | 国产精品无码永久免费888 | 中文字幕乱码亚洲无线三区 | 久久久中文久久久无码 | 国产黄在线观看免费观看不卡 | 大色综合色综合网站 | 永久免费观看美女裸体的网站 | 女高中生第一次破苞av | 久久亚洲国产成人精品性色 | 国产色视频一区二区三区 | 影音先锋中文字幕无码 | 丰满肥臀大屁股熟妇激情视频 | 无码纯肉视频在线观看 | 免费视频欧美无人区码 | 色欲综合久久中文字幕网 | 日本丰满熟妇videos | 丰满护士巨好爽好大乳 | 狠狠噜狠狠狠狠丁香五月 | 大肉大捧一进一出视频出来呀 | 一本久道久久综合婷婷五月 | www国产亚洲精品久久久日本 | 中文字幕精品av一区二区五区 | 麻豆人妻少妇精品无码专区 | 一本色道久久综合亚洲精品不卡 | 国产成人精品三级麻豆 | 55夜色66夜色国产精品视频 | 97夜夜澡人人双人人人喊 | 午夜福利一区二区三区在线观看 | аⅴ资源天堂资源库在线 | 成人无码视频免费播放 | 日韩av无码一区二区三区 | 国产午夜福利亚洲第一 | 国产成人无码a区在线观看视频app | 国产成人精品必看 | 中文字幕人妻无码一区二区三区 | 性欧美videos高清精品 | 76少妇精品导航 | 国产一精品一av一免费 | 97se亚洲精品一区 | 亚洲七七久久桃花影院 | 曰韩无码二三区中文字幕 | 久久午夜无码鲁丝片 | 国产精品久久久午夜夜伦鲁鲁 | 一本色道久久综合狠狠躁 | 一二三四在线观看免费视频 | 欧洲欧美人成视频在线 | 精品人妻av区 | 精品无码av一区二区三区 | 久久精品中文字幕大胸 | 国产精品二区一区二区aⅴ污介绍 | 狂野欧美激情性xxxx | 又湿又紧又大又爽a视频国产 | 中文字幕乱码人妻二区三区 | 国产精品a成v人在线播放 | 国产色精品久久人妻 | 久久精品国产日本波多野结衣 | 久久综合给久久狠狠97色 | 国产成人无码a区在线观看视频app | 欧美日韩在线亚洲综合国产人 | 漂亮人妻洗澡被公强 日日躁 | 一本精品99久久精品77 | 亚洲第一无码av无码专区 | 国产av无码专区亚洲awww | 国产成人精品无码播放 | 亚洲中文字幕无码一久久区 | 草草网站影院白丝内射 | 午夜精品久久久久久久 | 我要看www免费看插插视频 | 在线播放免费人成毛片乱码 | 精品国产av色一区二区深夜久久 | 波多野结衣一区二区三区av免费 | 国产精品资源一区二区 | 久久综合香蕉国产蜜臀av | 免费人成在线视频无码 | 国产精品人妻一区二区三区四 | 伊在人天堂亚洲香蕉精品区 | 国产无套内射久久久国产 | 狂野欧美性猛xxxx乱大交 | 欧美35页视频在线观看 | 成年美女黄网站色大免费视频 | 久久99精品久久久久婷婷 | 在线天堂新版最新版在线8 | 午夜理论片yy44880影院 | 国产人妻人伦精品 | 国产区女主播在线观看 | 久久精品中文闷骚内射 | 国产无av码在线观看 | 国产人妻大战黑人第1集 | 国产国语老龄妇女a片 | 熟妇人妻激情偷爽文 | 伊人色综合久久天天小片 | 久久天天躁狠狠躁夜夜免费观看 | 免费人成网站视频在线观看 | 免费观看黄网站 | 日本乱偷人妻中文字幕 | 国产人成高清在线视频99最全资源 | 久久久久久久久蜜桃 | 欧美大屁股xxxxhd黑色 | 最新版天堂资源中文官网 | 在线看片无码永久免费视频 | 国产又粗又硬又大爽黄老大爷视 | 美女黄网站人色视频免费国产 | 国产艳妇av在线观看果冻传媒 | 欧美丰满老熟妇xxxxx性 | 成人性做爰aaa片免费看不忠 | 老头边吃奶边弄进去呻吟 |