日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)

發布時間:2023/11/27 生活经验 76 豆豆
生活随笔 收集整理的這篇文章主要介紹了 读书笔记:编写高质量代码--web前端开发修炼之道(二:5章) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

讀書筆記:編寫高質量代碼--web前端開發修煉之道

這本書看得斷斷續續,不連貫,筆記也是有些馬虎了,想了解這本書內容的童鞋可以借鑒我的這篇筆記,希望對大家有幫助。

筆記有點長,所以分為一,二兩個部分:

第一部分:1-4章的筆記

第二部分:5章以及一些總結性的建議筆記等

轉載本文,請帶上本文地址(http://www.cnblogs.com/xmmcn/archive/2012/12/04/2800979.html),謝謝:)

?

第五章:高質量的JavaScript
1、團隊合作--如何避免js沖突
?? a 使用匿名函數控制變量作用域
???? "(function(){})()":這種形式很巧妙,先定義一個匿名函數,然后立即執行它。
?? b 利用全局作用域的變量在各匿名函數間搭起橋梁
???? 需要嚴格控制全局變量的數量,大量濫用就違背了使用匿名函數的初衷。
?? c 命名空間

View Code
     script(function(){var a = 123, b='hello world';GLOBAL.A = {};GLOBAL.A.CAT = {};GLOBAL.A.CAT.name = a;GLOBAL.A.CAT.sayName = function(){alert(GLOBAL.A.CAT.name);};});

?? d 代碼注釋
???? 添加必要的注釋,可以大大提高代碼的可維護性,對于團隊合作來說,更是十分有必要的。
2、給程序一個統一的入口--window.onload 和 DOMReady
3、extend
?? javascript 是支持面向對象的語言,但是它并不提供 extend 方法用于繼承。我們自己定義:

View Code
   script:function extend(subClass, superClass){var F = function(){};F.prototype = superClass.prototyte;subClass.prototyte = new F();subClass.prototyte.constructor = subClass;subClass.superClass = superClass.prototyte;if(superClass.prototyte.constructor == Object.prototype.constructor){superClass.prototype.constructor = superClass;}function Animal(name){this.name = name;this.type = 'animal';}Animal.prototype = {say: function(){alert('I\'m a(an) '+ this.type +', my name is '+ this.name);}};function Bird(name){this.constructor.superClass.constructor.apply(this, arguments);this.type = 'brid';}extend(Bird, Animal);Bird.prototype.fly = function{alert('I\'m flying');}var canary = new Brid('xiaocui');canary.say();// I'm a(an) bird, my name is xiaocuicanary.fly();// i'm flying

4、保持代碼彈性
5、可復用性
?? 組件需要一個根節點,以保持每個組件之間的獨立性
6、避免產生副作用
7、通過傳參實現定制
?? 如果一個函數內某個因素很不穩定,我們可以將它從函數內部分離出來,以參數的形式傳入,從而將不穩定因素和函數解耦。
8、控制 this 關鍵字的指向
?? 在javascript里,this指針的確是讓人捉摸不透的東西。例如javascript偽協議和內聯時間對于this的指向不同:

View Code
   html:// 彈出 “A”<a href="#" onclick="alert(this.tagName)">click me</a>// 彈出“underfined”<a href="javascript:alert(this.tagName)">click me</a>// 彈出“true”<a href="javascript:alert(this==window)">click me</a>setTimeout 和 setInterval 也會改變 this 的指向,如下:javascript:var name = "somebody";var adang = {name: 'adang',say: function(){alert('I\'m '+ this.name);}};adang.say();// I'm adangsetTimeout(adang.say, 1000);// I'm somebodysetInterval(adang.say, 100);// I'm somebody另外,"DomNode.onXXX" 也會改變 this 的指向,如:javascript:var name = "somebody";var btn = document.getElementById('btn');var adang = {name: 'adang',say: function(){alert('I\'m '+ this.name);}};btn.onclick = adang.say;// I'm BUTTON

?? 使用匿名函數可以解決這個問題,如下:

View Code
   javascript:var name = "somebody";var btn = document.getElementById('btn');var adang = {name: 'adang',say: function(){alert('I\'m '+ this.name);}};adang.say();// I'm adangsetTimeout(function(){adang.say();}, 1000);// I'm adangsetInterval(function(){adang.say();}, 1000);// I'm adangbtn.onclick = function(){adang.say();};// I'm adangsetTimeout(function(){alert(this == window);}, 1000);// truebtn.onclick = function(){alert(this == btn);};// true

?? setTimeout, setInterval 和 DomNode.onXXX 改變的都是直接調用函數里的 this 的指向,其中 setTimeout 和 setInterval 將直接調用的函數里的 this 指向 window。DomNode.onXXX 將直接調用的函數里的 this 指向 DomNode。使用匿名函數將我們的處理函數封裝起來,可以將我們的處理函數由直接調用變成通過匿名函數間接調用。
?? 另外,還可以通過 call 和 apply 函數來改變處理函數的 this 指向,如:

View Code
   javascript:var name = "somebody";var btn = document.getElementById('btn');var adang = {name: 'adang',say: function(){alert('I\'m '+ this.name);}};adang.say.call(btn);// I'm BUTTONsetTimeout(function(){adang.say.call(btn);}, 1000);// I'm BUTTONsetInterval(function(){adang.say.call(btn);}, 1000);// I'm BUTTONbtn.onclick = function(){adang.say.apply(btn);};// I'm BUTTON

?? 在 javascript 里使用繼承就需要用到 call 或 apply 函數。
?? 在 this 改變指向之前,將它指向的對象保存到一個變量中也是常用的方法,如:

View Code
   html:<input type="button" value="click me" id="btn" name="BUTTON" />javascript:var name = "somebody";var adang = {name: 'adang',say: function(){alert('I\'m '+ this.name);},init: function(){// this 指向 adang 對象var This = this;document.getElementById('btn').onclick = function(){// this 指向 btn 的 DOM 節點,This 指向 ading 對象This.say();// I'm adangthis.say();// 報錯,this.say is not a function};}};adang.init();

?? this 關鍵字會改變指向,只要避開這個關鍵字就可以得到一個穩定的引用。
9、預留回調接口
10、變成中的DRY規則
?? DRY:don't repeat yourself,強調在程序中不要將相同的代碼重復編寫多次,更好的做法是只寫一次,然后多處引用。(減少代碼量,方便修改維護)
11、用 hash 對象傳參
?? 使用 {key: value, xxx,} 對象傳遞參數
12、面向過程編程和面向對象編程
?? 面向過程:
???? 將程序分成“數據”和“處理函數”兩部分,程序以“處理函數”為核心,如果要執行什么操作,就將“數據”傳給響應的“處理函數”,返回我們需要的結果。
?? 面向過程有三個方面的問題:
???? a 數據和處理函數沒有直接的關聯,在執行操作的時候,我們不但要選擇相應的處理函數,還要自己準備處理函數需要的數據,也就是說,在執行才做時,我們需要同時關注處理函數和數據。
???? b 數據和處理函數都暴露在同一作用域內,沒有私有和公有的概念,整個程序中所有的數據和處理函數都可以互相訪問,在開發階段初期也許開發速度會很快,但到了開發后期和維護階段,由于整個程序耦合得非常緊密,任何一個處理函數和數據都有可能關聯到其他地方,容易牽一發而動全身,從而加大了修改難度。
???? c 面向過程的思維方式是典型的計算機思維方式--輸入數據給處理器,處理器內部執行運算,處理器返回結果。而實際生活中,我們的思路卻不是這樣.
?? 面向對象(Object Oriented):
???? 拋開計算機思維,使用生活中的思維進行編程。
???? 面向過程的思維是描述一個個“動作”,而面向對象的思維就是描述一個個“物件”,客觀生活中的物件,都可以通過面向對象思維映射到程序中--“物件”對應“對象”,“狀態”對應“屬性”,“行為”對應“動作”。
???? 面向過程編程:

View Code
     javascript:var name = 'adang', state = 'awake';var say = function(oName){alert('I\'m '+ oName);};var sleep = function(oState){oSate = 'asleep';};say(name);sleep(state);面向對像編程:javascript:var adang = {name: 'adang',state: 'awake',say: function(){alert('I\'m '+ this.name);},sleep: function(){this.state = 'asleep';}};adng.say();adang.sleep();

?? 面向對象(Object Oriented),簡稱OO。OO其實包括OOA(Object Oriented Analysis,面向對象分析)、OOD(Object Oriented Design,面向對象設計)和OOP(Object Oriented Programming,面向對象的程序設計)。面向對象的語法只對應OOP,只是OO的一部分。
???? 一個典型的OO編程過程應該是先整理需求,根據需求進行OOA,將真實世界的客觀物件抽象成為程序中的類或對象,這個過程經常會用到的是UML語言,也稱UML建模,OOA的輸出結果是一個個類或對象的模型圖。接下來要進行OOD,這一步的目的是處理類之間的耦合關系,設計類或對象的接口,此時會用到各種設計模式,例如觀察者模式、責任鏈模式等。OOA和OOD是個反復迭代的過程,他們本身沒有清晰的邊界,是互相影響、制約的。等OOA和OOD結束之后,才到OOP,進行實際的編碼工作。
???? OOA和OOD是面向對象編程的思想和具體的語言無關,而OOP是面向兌現編程的工具,和選用的語言相關。OOP是使用面向對象技術的基礎,面向對象的思維最后是要通過OOP來實施的。
?? javascript的面向對象編程
???? javascript是基于原型的語言,通過 new 實例化出來的對象,其屬性和行為來自于兩部分,一部分來自于構造函數,另一部分來自于原型。
?? 共有和私有

View Code
     javascript:// 定義 Animal 類function Animal(name){// 共有屬性this.name = name || 'xxx';this.type = 'animal';// 私有屬性var age = 20;// 私有方法var more = function(){alert('I\'m moving now');}}Animal.prototype = {// 公有方法say: function(){alert('I\'m a(an) '+ this.type +', my name is '+ this.name +',I\'m '+ age);},act: function(){move();}};// 實例化Animal類varmyDog = new Animal('wangcai');myDog.say();// 報錯,age未定義myDog.act();// 報錯,move is not defined

???? 從上我們可以知道,公有方法不能訪問私有屬性和私有行為,那么如何解決呢?最好的方法就是把所有的公有方法都私有化(都寫在類的構造函數里面),這樣屬性和行為都共同作用在構造函數的作用域里,如下:

View Code
     javascript:function Animal(name){this.name = name || 'xxx';this.style = 'animal';var age = 20;var move = function(){alert('xxxx');};this.say = function(){alert('xxxx');};this.act = function(){move();};}Animal.prototype = {};var myDog = new Animal('waicai');myDog.say();myDog.act();

???? 將所有屬性和行為全部寫在構造函數里,的確方便,但并不推薦這么做。因為一個類的原型在內存中只有一個,寫在原型中的行為,可以被所有實例所共享,實例化的時候,并不會在實例的內存中復制一份,而寫在類里的行為,實例化的時候會在每個實例里復制一份,占用更多的內存空間。
???? 寫在原型中的行為一定是公有的,而且無法訪問私有屬性,所以如何處理私有行為和私有屬性是個難題。一般來說,如果對屬性和行為的私有性有非常高的強制性,比如說多人合作,為了確保維護不會出現問題,在開發之初明確各個類的接口,除了必要的接口設為共有,其他所有接口一律設為私有,以此來降低類之間的耦合程度,確保可維護性,這時我們不得不犧牲內存,將私有行為放在構造函數里,實現真正的私有;
???? 命名來確定私有,比如 this._age = 20;
???? 監聽屬性的 valueChange:

View Code
     javascript:function Animal(name){var name = name, type = 'animal';var _age = 20;var master = 'adang';// 添加 master 屬性,默認為adangthis.getName = function(){return name;};this.setName = function(o){if(o != 'waicai' && o != 'xiaoqiang'){alert('您設置的那么值不合要求');return;}name = o;this._valueChangeHandler('name');// 觸發 name 屬性的 valueChange 事件};this.getMaster = function(){// master 屬性的獲取方法return master;};this.setMaster = function(o){// master 屬性的設置方法master = o;thi._valueChangeHandler('master');// 觸發 master 屬性的 valueChange 事件};this.getType = function(){};this.setType = function(o){alert('賦值失敗,Animal類的 type 屬性是只讀的 ');};this._getAge = function(){return _age;};this._setAge = function(o){_age = o;};}Animal.prototype = {_move: function(){alert('I\'m moving now');},say: function(){alert('I\'m a(an) '+ this.getType() +', my name is '+ this.getName() +', I\'m '+ this._getAge());},act: function(){this._move();},onChange: function(valueName, fun){// 公有行為,用于注冊屬性的 valueChange 事件this['_'+ valueName +'ChangeHandlers'] = this['_'+ valueName +'ChangeHandlers'] || [];this['_'+ valueName +'ChangeHandlers'].push(fun);},_valueChangeHandler: function(valueName){var o = this['_'+ valueName +'ChangeHandlers'];if(o){for(var i=0,n=o.length; i<n; i++){var methodName = 'get'+ valueName.charAt(0).toUpperCase() + valueName.slice(1);o[i](this[methodName]);// 把 this.getType() 作為屬性來調用,返回值作為參數傳遞}}}};var myDog = new Animal('wangcai');// 給 myDog 注冊 name 屬性的 valueChange 事件myDog.onChange('name', function(o){if(o == 'xiaoqiang'){alert('1');}else{alert('2');}});// 給 myDog 換個新名字 xiaoqiangmyDog.setName('xiaoqiang');// 1//給 myDog 再注冊一個 name 屬性的 valueChange 事件myDog.onChange('name', function(o){alert('my new name is '+ o);});..........

???? 在真實世界中,我們很多的思維習慣都是狀態驅動的,編程時監聽屬性的 valueChage 事件可以幫助我們更接近真實世界的思維習慣。
13、繼承
?? 正統的面向對象的語言都會提供 extend 之類的方法用于處理類的繼承,但javascript并不提供 extend 方法。
?? 在javascript中實例的屬性和行為是由構造函數和原型兩部分共同組成的,我們定義2個類:Animal 和 Bird ,他們在內存中的表現如下:
?? 圖例:
???? Animal類??????? Animal的構造函數??????? Animal的原型
???? Bird類????????? Bird的構造函數????????? Bird的原型
?? 二者互不聯系。
?? 如果想讓 Bird 繼承自 Animal,那么我們需要把 Animal 構造函數和原型中的屬性和行為全部傳給Bird的構造函數和原型。參考以下代碼:

View Code
   javascript:// 先定義 Animal 類function Animal(name){this.name = name, this.type = 'animal';}Animal.prototype = {say: function(){alert('I\'m a(an) '+ this.type +', my name is '+ this.name);}};// 我們再定義一個類 Bird// example 1function Bird(name){Animal(name);}Bird.prototype = {};// 實例化Bird對象var myBird = new Bird('xiaocui');alert(myBird.type);// undefined

?? 為什么這個會錯呢?
?? 在javascript中,function 有 2 種不同的用法:
?? a 作為函數存在,直接使用“()”進行調用,例如:function test(){}; test(); test 被用作函數,直接被 “()”符號調用
?? b 作為類的構造函數存在,使用 new 調用,例如“function test(){}; new test();” test 作為類的構造函數,通過 new 進行 test 類的實例化。
?? 這 2 種方法的調用,function 內部的 this 指向會有所不同---作為函數的 function,其 this 指向的是 window 對象,而作為類構造函數的 function,其 this 指向的是實例對象。
?? 讓 Animal 內部的 this 指向 Bird 類的實例,可以通過 call 或 apply 方法實現,如下:

View Code
   javascript:// example 2function Bird(name){Animal.call(this, name);}Bird.prototype = {};// 實例化Bird對象var myBird = new Bird('xiaocui');alert(myBird.type);// animal

?? 構造函數的屬性和行為已經實現了繼承,接下來我們要實現原型中屬性和行為的繼承。

View Code
   javascript:// example 3function Bird(name){Animal.call(this, name);}Bird.prototype = Animal.prototype;Bird.prototype.fly = function(){alert('I\'m flying');};// 實例化Bird對象var myBird = new Bird('xiaocui');myBird.say();// xxxxxmyBird.fly();// I'm flyingvar myDog = new Animal('wangcai');myDog.fly();// I'm flying

?? 我們只想給 Bird 類添加 fly 行為,為什么 Animal 類也獲得了 fly 行為呢?這涉及 傳值 和 傳址 兩個問題---在javascript中,賦值語句會用 傳值 和傳址 兩種不同的方式進行賦值,如果是數值型、布爾型、字符型等基本數據類型,在進行賦值時會將數據復制一份,將復制的數據進行賦值,也就是通常所說的傳值,如果是數組、hash對象等復雜數據類型(數組、hash對象可包括簡單類型數據),在進行賦值時會直接用內存地址賦值,而不是將數據復制一份,這就是通常所說的 傳址。eg:

View Code
   javascript:var a = 10, b = a;// 基本數據類型b++;var c = [1, 2, 3], d = c;d.push(4);alert(a);// 10alert(b);// 11alert(c.join(','));// 1,2,3,4alert(d.join(','));// 1,2,3,4

?? c, d 指向同一份數據地址,所以改變其中一個,另外一個也會改變,而基本數據類型不會。
?? 那么如何復制對象呢?最簡單的做法是遍歷數組或者hash對象,將數組或hash對象這種復雜的數據拆分成一個個簡單數據,然后分別賦值,eg:

View Code
   javascript:var a = [1, 2, 3], b = {name: 'adang', sex: 'male', tel: '123456'};var c = [], d = {};for(var p in a){c[p] = a[p];}for(var p in b){d[p] = b[p];}c.push(4);d.email = 'xxx@gmail.com';alert(a);// 1,2,3alert(c);// 1,2,3,4alert(b.email);// undefinedalert(d.email);// xxx@gmail.com

?? prototype 本質上也是個 hash 對象,所以直接使用它賦值時會進行傳址,這也是為什么子類擴張prototype,而父類也會帶上子類的prototype。我們可以用 for in 來遍歷prototype,從而實現prototype的傳值。但因為 prototype 和 function(用作類的function)的關系,我們還有另一種方法實現prototype的傳值---new SomeFunction(),eg:

View Code
   javascript:// example 4function Bird(name){Animal.call(this, name);}Bird.prototype = new Animal();// 這里不是很明白,new 一個父類實例賦值給 Bird.prototype 就能實現 原型 的繼承了嗎?如果是,是為什么呢?Bird.prototype.constructor = Bird;Bird.prototype.fly = function(){alert('I\'m flying');};// 實例化Bird對象var myBird = new Bird('xiaocui');myBird.say();// xxxxxmyBird.fly();// I'm flyingvar myDog = new Animal('wangcai');myDog.fly();// 報錯,myDog.fly is not a function

?? 我們發現這里有這么一句:Bird.prototype.constructor = Bird; 這是因為 Bird.prototype = new Animal(); 時,Bird.prototype.constructor 指向了 Animal,我們需要將它糾正,重新指回 Bird。
?? 這樣的方式可以順利的實現javascript的繼承,但是我們還可以進一步將它們進行封裝,定義個 extend 函數:

View Code
   javascript:function extend(subClass, superClass){var F = function(){};// 作為class的函數F.prototype = superClass.prototype;subClass.prototype = new F();subClass.prototype.constructor = subClass;// 指回來subClass.superclass = superClass.prototype;if(superClass.prototype.constructor == Object.prototype.constructor){superClass.prototype.constructor = superClass;}}function Animal(name){this.name = name;this.type = 'animal';}Animal.prototype = {say: function(){alert('I\'m a(an) '+ this.type +' , my name is '+ this.name);}};function Bird(name){this.constructor.superclass.constructor.apply(this, arguments);this.type = 'Bird';}extend(Bird, Animal);Bird.prototype.fly = function(){alert('I\'m flying');}var canary = new Bird('xiaocui');canary.say();// .........canary.fly();// I'm flying

14、用面向對象方式重寫代碼
?? 下面以 電話本程序 為例.
?? 首先,我們要進行 OOA,從現實邏輯中抽象出類。使用面向過程的編程方式時,處理函數是非常核心的部分,在命名的時候它很可能是個動詞,例如 getTel、addItem,而面向對象的編程方式,最核心的部分是類,類的命名往往是個名詞,例如 Animal、Bird。我們說明面向對象編程的時候,往往用一些客觀世界真實存在的東西來舉例,例如人、貓、狗,但類不一定是客觀存在的某個物件,例如這次我們要寫的電話本程序,就很難對應到客觀設計界的某個真實存在的物件,它更像是一個邏輯上的物件,管理者關于電話記錄的所有邏輯。它保存著許多電話記錄,它可以用來添加、刪除和查詢電話記錄。我們給它取個什么名字好呢?PhonebookManager,電話本管理者。
?? 現在我們首先要明確類名以及類的接口,至于接口里的具體邏輯如何實現,我們暫時先不管,在 OOA 這一步,我們只需要用 UML 語言將類描述出來即可,如下圖:
?? UML圖:
?? |--------------------|
?? |? PhonebookManager? |
?? |--------------------|
?? |? -phonebook:hash?? |
?? |--------------------|
?? |? +getTel():string? |
?? |? +addItem():void?? |
?? |? +removeItem():void|
?? |--------------------|
?? UML 描述類的方式很簡單,一個方框代表一個類,將方框劃成上中下三欄,第一欄填入類名,第二欄填入類的屬性,第三欄填入類的行為,其中公有屬性和公有行為需要在屬性和行為名前加上“+”號,私有屬性和行為需要加上“-”號。
?? 在本例中,PhonebookManager 類有一個電話本屬性 phonebook,記錄著保存在 PhonebookManager 中的電話記錄,有 getTel、addItem、removeItem行為,分別用于查詢電話、添加記錄和刪除記錄。因為我們需要讓類的對外提供的接口盡可能的少,除了必要的接口應該設為公有,其他的都應該設為私有。
?? 一般來說,OOA結束之后,我們需要進行OOD,但本例實在太簡單了,用不上OOD。只有一些復雜的邏輯處理才可能用得上OOD。
?? 接下來,我們要將OOA和OOD的成果用程序編寫出來,也就是OOP的環節。

View Code
   javascript:// 定義電話本管理類function PhonebookManager(o){this._phonebook = o;}PhonebookManager.pototype = {// 查詢電話getTel: function(oName){var tel = '';for(var i=0; i<this._phonebook.length; i++){if(this._phonebook[i].name == oName){tel = this._phonebook[i].tel;break;}}return tel;},// 添加記錄addItem: function(oName, oTel){this._phonebook.push({name: oName, tel: oTel});},// 刪除記錄removeItem: function(oName){var n;for(var i=0; i<this._phonebook.length; i++){if(this._phonebook[i].name == oName){n = i;break;}}if(n != undefined){this._phonebook.splice(n, 1);}}};使用:javascript:var myPhonebookManager = new PhonebookManager({{name: 'zhang', tel: '111'},{name: 'wang', tel: '222'}});var zhangTel = myPhonebookManager.getTel('zhang');myPhonebookManager.addItem('huang', '333');myPhonebookManager.removeItem('wang');

?? 電話本的重構已經完成了,進行tab 的重構。
?? (略)
15、prototype 和內置類
?? javascript語言中提供了一些內置類,包括 Array、String、Function等,它們剔紅了javascript的大部分基本數據類型。這些內置類通常會提供一些方法和屬性,例如 Array 類提供的 length 屬性,push、pop方法,String提供length屬性,replace、split方法,Function 提供 call、apply方法等。
?? 需要說明的是,這些內置類不一定需要通過 new 的方式進行實例化,我們平時習慣更簡短的方式調用它們,但其本質上是一樣的。

View Code
   javascript:var a = bew String('hello world');// 通過new String()實例化 string 類型對象var b = 'hello world';// 直接通過 '' 實例化 string 類型對象alert(a.length);alert(b.length);var c = new Array(1, 2, 3);var d = [1, 2, 3];c.push(4);d.pop();alert(c);alert(d);

?? 只要是類就會有原型,不管它是自定義類還是javascript的內置類,我們可以通過修改內置類的原型,讓javascript基本類型的對象獲得一些有趣的功能。例如,在很多語言中,Array具有each、map等方法,但javascript沒有。沒關系,既然原生的javascript并不提供這些方法,那么我們自己擴展它好了。

View Code
   javascript:Array.prototype.each = function(fun){for(var i=0,n=this.length; i<n; i++){fun(this[i], i);}};Array.prototype.clone = function(){var o = [];this.each(function(v, k){o[k] = v;});return o;};Array.prototype.map = function(fun){var o = [];this.each(function(v, k){o[k] = function(v, k);});return o;};// 因為在IE中 delete 是保留字,所以方法名改用DeleteArray.prototype.Delete = function(a){var o = this.clone();for(var i=o.length, n=0; i>n; i--){if(o[i] == a){o.splice(i, 1);}}return o;};var a = [1, 2, 3, 4, 5];var str = '';a.each(function(v, k){str += k+':'+ v +', ';});alert(str);// 0:1, 1:2, 2:3, 3:4, 4:5,var b = a.map(function(v, k){return v*10;});alert(a);// 1,2,3,4,5alert(b);// 10,20,30,40,50var c = b.Delete(20);alert(c);// 10,30,40,50

?? 這段代碼中最難理解的地方在于 擴展中this代表什么?以前我們說過,無論在類的構造函數中還是在原型中,this都指向實例化的對象。明白了這一點,以上代碼就不難理解了。
?? 除了可以擴展內置類的方法,我們還可以重寫內置類的方法。

View Code
   javascript:var a = [1, 2, 3];alert(a);// 1,2,3Array.prototype.toString = function(){return 'I\'m an  array';}alert(a);// I'm an array值得一提的是,alert(a) 時,自動調用了 a 的toString 方法。在需要字符串時,對象會隱式地自動調用 toString 方法,包括我們自定義的對象。javascript:function Dog(o){this.name = o;}var myDog = new Dog('wang cai');alert(myDog);// [object object]Dog.prototype.toString = function(){return 'my name is '+ this.name;}alert(myDog);// my name is wang caivar me = {name: 'adang',email: 'xxx@163.com',toString: function(){return 'I\'m adang,my email is xxx@163.com';}};alert(me);// I'm adang,my email is xxx@163.com

?? 給自定義類定義 toString 方法,可以為我們在調試時提供更多有用的信息。
?? 內置類的方法可以重寫,但屬性卻不能重寫,比如。

View Code
   javascript:Array.prototype.length = 1;String.prototype.length = 1;alert([1, 2, 3].length);// 3alert('abc'.length);// 3

?? 在javascript中,包括內置類和自定義類,所有類的祖先都是Object,所以如果想對所有對象都擴展方法,可以通過修改Object類的原型實現,如:

View Code
   javascript:Object.prototype.test = function(){alert('hello world');}var a = [1, 2, 3], b = 'abc', c = {}, d = true, e = function(){};a.test();b.test();c.test();d.test();e.test();function Dog(o){this.name = o;}Dog.prototype.toString = function(){return 'my name is '+ this.name;}var f = new Dog(wang cai);f.test();

?? 修改內置類的原型可以再編程時給我們帶來很大方便,但也有些人非常排斥這種做法,認為它對內置類的原型造成了“污染”,因為內置類的原型也可以理解為是全局作用域的,如果對它進行修改,在多人合作時有可能對別人的代碼造成影響。修改內置類的原型等于修改了統一的游戲規則,雖然可以帶來很大的方便,但同時也會給多人合作帶來沖突隱患,它是有副作用的。
?? 所以有些人更愿意使用這樣的方式來擴張內置類的方法,如下:

View Code
   javascript:function myArray(o){this.getArray = function(){return o;}}myArray.prototype = {each: function(fun){var o = this.getArray();for(var i=0, n=o.length; i<n; i++){fun(o[i], i);}}};var a = new myArray([1, 2, 3]), str = '';a.each(function(v, k){str += k +':'+ 'v'+ ', ';});alert(str);// 0:1, 1:2, 2:3, 

16、標簽的自定義屬性

View Code
   html:<a id="a" class="b" title="百度" href="http://www.baidu.com" onclick="alert(this.href);return false;" data-type="鏈接">baidu</a>javascript:var node = document.getElementById('a');alert(typeof node);// object// 使用 getAttribute('xxx') 獲取節點對象屬性alert(node.getAttribute('id'));// IE 和 Firefox : aalert(node.getAttribute('class'));// IE : null// Firefox : balert(node.getAttribute('className'));// IE : b// Firefox : nullalert(node.getAttribute('title'));// IE 和 Firefox : 百度alert(node.getAttribute('href'));// IE 和 Firefox : http://www.baidu.comalert(node.getAttribute('onclick'));// IE : function onclick(){alert(this.href);return false;}// Firefox : alert(this.href);return false;alert(node.getAttribute('innerHTML'));// IE : baidu// Firefox : null// 使用 node.xxx 獲取節點對象屬性alert(node.id);// IE 和 Firefox : aalert(node.className);// IE 和 Firefox : balert(node.title);// IE 和 Firefox : 百度alert(node.href);// IE 和 Firefox : http://www.baidu.comalert(node.onclick);// IE : function onclick(){alert(this.href);return false;}// Firefox : function onclick(event){alert(this.href);return false;}alert(node.innerHTML);// IE 和 Firefox : baidu

?? 除了常規屬性,我們還可以給 html 標簽定義一些自定義屬性,這些自定義屬性同樣在javascript中獲取。但和常規屬性不同,Firefox 下無法通過 node.xxx 獲取到自定義屬性值,只能使用 node.getAttribute('xxx') 獲取。
?? 所以,從兼容性考慮,筆者建議對于常規屬性,統一使用 node.xxx 的方式讀取,對于自定義屬性,統一使用 node.getAttribute('xxx') 讀取。
?? 將復類型的數據轉化成字符串,稱為數據的序列化,其逆操作叫做數據的反序列化。
?? 借助html自定義屬性,我們可以儲存各種各樣的數據,因為屬性只能是字符串類型的,所以我們要先把復雜數據序列化,做成 長得像hash或數組的字符串 才行。
?? 數據的反序列化一般使用 eval 函數實現。

View Code
   javascript:var strObject = '{name: "huang", tel: "123"}';var obj = eval('('+ strObject +')');alert(obj.name);// huangalert(obj.tel);// 123

17、標簽的內聯事件和event對象
?? event 對象在IE和Firefox下的表現是不同的。在IE下,event是window對象的一個屬性,是在全局作用域下的,而在Firefox里,event對象作為事件的參數存在,如下:

View Code
   html:<input type="button" id="btn" value="click me" />javascript:document.getElementById('btn').onclick = function(){alert(arguments.length);// IE下彈出0;Firefox下彈出1};

?? 如果在標簽的內聯事件中觸發事件又如何呢?代碼:

View Code
   html:<input type="button" id="btn" value="click me" onclick="handler();" />javascript:function handler(){alert(arguments.length);}

?? 在IE肯Firefox下,這段代碼彈出的都是 0。
?? 在標簽內聯事件中,我們使用 arguments[0] 可以再Firefox 下訪問到 event 對象。
?? 不使用標簽內聯事件時,我們可以給處理函數傳參,從而指定 arguments[0] 的變量名。

View Code
   html:<input type="button" id="btn" value="click me" />javascript:document.getElementById('btn').onclick = function(e){e = window.event || e;// 兼容 ie 和 firefox ,指向 event 對象};

?? 在標簽內聯事件中,我們沒辦法指定參數名,是不是就沒辦法直接寫個變量在 ie 和 firefox 下兼容的指向 event 對象呢?不是的,可以用 event 這個變量名兼容的指向 event 對象,注意,只能是 event,諸如 a,b,Event 之類都是不行的。

View Code
   html:<input type="button" id="btn" value="click me" onclick="alert(event.type);" />

?? 這段代碼在ie 和 firefox下都正確的彈出 "click"。
?? 有趣的是,標簽內聯事件中我們甚至可以寫注釋,可以使用字符串:

View Code
   html:<input type="button" id="btn" value="click me" onclick="alert(1);//alert(2);alert(3);" /><input type="button" id="btn" value="click me" onclick="alert(1);/*alert(2);*/alert(3);" /><input type="button" id="btn" value="click me" onclick="var a='abc';alert(typeof a);" />

?? 如果我們既用標簽內聯事件綁定了事件,又用 DomNode.onXXX 綁定了事件,那么 DomNode 綁定的事件函數會替代標簽內聯事件:

View Code
   html:<input type="button" id="btn" value="click me" onclick="alert(123);" />javascript:doccument.getElementById('btn').onclick = function(){alert(456);};

?? 其結果就是,彈出 456 ,不彈出 123。
?? 再如果重復綁定呢:

View Code
   javascript:doccument.getElementById('btn').onclick = function(){alert(123);};doccument.getElementById('btn').onclick = function(){alert(456);};

?? 結果會彈出 456 ,不彈出 123 。后面的會覆蓋前面的。
?? 如果通過 attachEvent 和 addEventListener 來綁定事件:

View Code
   html:<input type="button" id="btn" value="click me" onclick="alert(123);" />javascript:function handler(){alert(456);}var btn = document.getElementById('btn');if(document.all){btn.attachEvent("onclick", handler);}else{btn.addEventListener("click", handler, false);}

?? 先彈出 123,然后彈出 456.

18、利用事件冒泡機制
?? 冒泡的思路是在祖先節點上監聽事件,結合 event.target/event.srcElement 來實現最終效果。利用冒泡可以讓事件掛鉤更干凈,有效減少內存開銷。

19、改變DOM樣式的三種方式
?? javascript 編程很重要的一個功能就是用于改變DOM節點的樣式。
?? a 最簡單最直接的方式就是設置 DomNode 的 style 屬性。

View Code
   html:<span id="test">hello world</span>javascript:var node = document.getElementById('test');node.style.color = 'red';node.style.backgroundColor = 'black';node.style.fontSize = '40px';node.style.fontWeight = 'bold';

?? 這種寫法拖沓又冗長,而且過多的承擔起了變現層的職責,而變現層應該是由css控制的,所以又有了下面的方式,控制 DomNode 的class屬性

View Code
   style:.testStyle {color: red;background-color: black;font-size: 40px;font-weight: bold;}html:<span id="test">hellow world</span>javascript:var node = document.getElementById('test');node.className = 'testStyle';

?? 第三種方式:
?

View Code
  html:<span id="test">hellow world</span>javascript:function addStyleNode(str){var styleNode = document.createElement('style');styleNode.type = 'text/css';if(styleNode.styleSheet){styleNode.styleSheet.cssText = str;}else{styleNode.innerHTML = str;}document.getElementsByTagName('head')[0].appendChild(styleNode);}addStyleNode('span {font-size: 40px;background: #000;color: #fff;}#test {color: red;}');

?? 需要注意的是,style的DOM節點在Firefox下可以直接對innerHTML屬性進行讀寫操作,但在IE下,它的innerHTML屬性是只讀的。IE下要通過styleSheet.cssText進行寫操作。

20、寫在規則前面的話
?? 項目的可維護性第一。好的可維護性可以從四個方面獲得:
?? a 代碼的耦合,高度模塊化,將頁面內的元素視為一個個模塊,互相獨立,盡量避免耦合過高的代碼,從html、css、javascript三個層面考慮模塊化。
?? b 良好的注釋。
?? c 注意代碼的彈性,在性能和彈性的選擇上,一般情況下以彈性為優先考慮條件,在保證彈性的基礎上,適當優化性能。
?? d 嚴格按照規范編寫代碼。

21、一些總結性的結論(參考):
?? 為避免命名沖突,命名規則如下:
?? a 公共組件因為高度重用,命名從簡,不要加前綴。
?? b 各欄目的響應代碼,需要前綴,前綴為工程師姓名拼音的首字母。例如:"ad_"。(我覺得該條可酌情考慮)
?? c 模塊組件化,組件中的class或id名采用駱駝命名法和下劃線相結合的方式,單詞之間的分隔靠大寫字母分開,從屬關系靠下劃線分隔。例如:.textList_first {}
?? d 命名清晰,不怕命名長,確保css優先級權重足夠低,方便擴展時的覆蓋操作。
?? e 命名要有意義,盡量使用英語命名,不要用拼音。

?? 分工安排:
?? a 公共組件(包括common.css和common.js)一人維護,各子頻道專人負責,每個頻道正常情況下一人負責,要詳細寫明注釋,如果多人合作,維護的人員要添加注釋信息。
?? b 視覺設計師設計完設計圖后,先和交互設計師溝通,確定設計可行,然后先將設計圖給公共組件維護者,看設計圖是否需要提取公共組件,然后再提交給相應頻道的前端工程師。如果有公共組件要提取,公共組件維護者需要對頻道前端工程師說明。
?? c 如果確定沒有公共組件需提取,交互設計師直接和各欄目的前端工程師交流,對照著視覺設計師的設計圖進行需求說明,前端工程師完成需求。
?? d 前端工程師在制作頁面時,需先去common文件中查詢是否已經存在設計圖中的組件,如果有,直接調用;如果沒有,則在app.css和app.js中添加相應的代碼(app指各頻道自己的文件)。
?? e 前端工程師在制作過程中,發現高度重用的模塊,卻未被加入到公共組件中,需向公共組件維護人員進行說明,然后公共組件維護人決定是否添加該組件。如果確定添加,則向前端工程師們說明添加了新組件,讓前端工程師們檢查之前是否添加了類似組件,統一更新成新組件的用法,刪除之前自定義的css和javascript。雖然麻煩,但始終把可維護性放在首位。
?? f 公共組件維護者的公共組件說明文檔,需提供配套的圖片和說明文字,方便閱讀。

?? 注釋規則:
?? a 公共組件和各欄目的維護者都需要在文件頭部加上注釋說明:
?? /**
?? * 文件用途說明
?? * 作者姓名
?? * 聯系方式
?? * 制作日期
?? **/
?? /**
?? * 公共組件
?? * author: adang
?? * email: xxx@gmail.com
?? * date: 2012-10-11
?? **/
?? b 大的模塊注釋
?? //=============
?? // 代碼用途
?? //=============
?? c 小的注釋
?? // 代碼說明
?? 注意:注釋單獨占一行

?? html規范:
?? a 統一文檔類型說明。
?? b 統一文件編碼。
?? c 統一TAB縮進長度(四個空格)。
?? d 標簽名,屬性名全部小寫,屬性加引號,單標簽需閉合。
?? e html應在保證彈性的基礎上盡量減少嵌套層數。
???? 嚴格區分作為內容的圖片和作為背景的圖片。作為背景的圖片采用css sprite整合。大圖的安排也遵從 common+app 的方式。css sprite 雖然減少了http請求,但需background-position定位增加了可維護成本。如果圖片有修改,建議不要刪除已添加的圖片,而是在空白處新增修改后的圖片,減少修改的風險。
?? f 標簽語義化,webdevelper去樣式可讀性良好。
?? g 方便服務端嵌套模板,html需為模塊添加注釋。格式為:
?? <!--頭部開始{-->
?? .....
?? <!--}頭部結束-->

?? css 規范:
?? a css reset 用YUI的css reset。
?? b css 采用 css reset+common.css+app.css的形式。
?? c app.css采用分工制,一個前端工程師負責一個欄目,如果多人維護,需要添加注釋。
?? d 為方便組件模塊化和提高彈性,正常情況下,為避免外邊界沖突,組件不設置外邊界,外邊界用組合css的方式實現,如:
?? html:
?? <p>12345</p>
?? <ul class="textList">
???? <li>1)xxxx</li>
???? <li>2)xxxx</li>
?? </ul>
?? <p>abcde</p>
?? <ul class="textList2">
???? <li>1)xxxx</li>
???? <li>2)xxxx</li>
?? </ul>
?? css:
?? .textList, .textList2 {margin-top: 10px;xxx}
?? .textList2 {margin-top: 20px;}
?? 上面的方式,不靈活,可參考下面的代碼組織方式:
?? html:
?? <p>12345</p>
?? <ul class="textList marginTop10">
???? <li>1)xxxx</li>
???? <li>2)xxxx</li>
?? </ul>
?? <p>abcde</p>
?? <ul class="textList marginTop20">
???? <li>1)xxxx</li>
???? <li>2)xxxx</li>
?? </ul>
?? css:
?? .textList {xxx}
?? e 為便面組件的上下外邊距重合問題和IE的haslayout引發的bug,各模塊除特殊需求,一律采用 marginTop 設置上下外邊距。
?? f 優先對已存在的common.css中類進行組合,較少自定義類的數量。
?? g css用一行的寫法,避免行數太長,不利查找。
?? h 正是發布前應進行壓縮,壓縮后文件的命名應添加“_min”后綴。

?? javascript 規范:
?? a 底層javascript庫采用YUI。
?? b 統一頭部中只載入YUI load組件,其他組件通過loader對象加載。
?? c javascript盡量便面使用全局變量,通過命名空間或匿名函數將變量封裝到閉包中。
?? d 正是發布前應進行壓縮,壓縮后文件的命名應添加“_min”后綴。

?

筆記第一部分:1-4章的筆記

轉載請帶上原文地址(http://www.cnblogs.com/xmmcn/archive/2012/12/04/2800979.html),謝謝:)

?

轉載于:https://www.cnblogs.com/xmmcn/archive/2012/12/04/2800979.html

總結

以上是生活随笔為你收集整理的读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

www日韩在线观看 | 黄色一级免费网站 | 中文在线字幕免费观看 | 激情五月五月婷婷 | a黄色影院| 99r在线| 国产成人综合在线观看 | 亚洲天堂va | 最新中文字幕在线播放 | 国产人成在线视频 | 在线国产一区二区 | 色吊丝在线永久观看最新版本 | 午夜视频免费播放 | 99在线播放 | 在线视频国产区 | 亚洲成人资源在线观看 | 久久久久久久久久免费视频 | 国产成人区 | 亚洲精品在线视频播放 | 中文字幕在线观看一区 | 亚洲精品一区中文字幕乱码 | 欧洲精品在线视频 | 久久久国产精品成人免费 | 九九九视频精品 | 国产aa免费视频 | 久久久国产99久久国产一 | 日韩在线免费高清视频 | 亚洲va欧美va人人爽春色影视 | 国产三级香港三韩国三级 | 2022国产精品视频 | 久久亚洲美女 | 久久久久免费 | 国产又粗又猛又色又黄视频 | 日韩精品短视频 | 亚洲高清在线观看视频 | 国产玖玖精品视频 | 丁香六月婷婷开心 | 午夜精品一区二区三区免费 | 91福利视频一区 | 97超碰.com| 亚洲涩涩涩涩涩涩 | 五月天久久激情 | 少妇高潮冒白浆 | 99精品免费久久久久久日本 | 日韩亚洲在线视频 | 五月av在线 | 亚洲区另类春色综合小说校园片 | 日韩欧美视频一区 | 欧美大片第1页 | 婷婷视频导航 | 98久9在线 | 免费 | 91精品久久久久久久久久久久久 | 久久一级电影 | 精品1区2区3区 | 中文字幕免费观看视频 | 久草精品在线观看 | 99视频在线免费看 | 日日精品 | 亚洲成人高清在线 | 狠狠干中文字幕 | 久久久av免费 | 五月婷婷天堂 | 日产av在线播放 | 99久久久免费视频 | 日韩在线观看你懂的 | 午夜视频在线观看一区二区三区 | 免费观看的黄色 | 在线播放一区二区三区 | 国产精品久久99综合免费观看尤物 | 日韩电影中文字幕在线 | 日韩首页 | 国产精品久久久久一区二区三区共 | 亚洲综合一区二区精品导航 | 婷婷久久综合网 | 偷拍精偷拍精品欧洲亚洲网站 | 成人国产精品 | 国产精品12 | 综合网天天 | 国产特级毛片 | 欧美精品亚洲精品 | 中文字幕在线看视频国产 | 欧美日韩国产亚洲乱码字幕 | 在线你懂 | 国产精品小视频网站 | 五月开心六月伊人色婷婷 | 99精品视频在线观看播放 | 免费在线观看日韩欧美 | 天天爱天天操天天爽 | 国产视频一区在线 | 高清av免费一区中文字幕 | 伊人色**天天综合婷婷 | 国产高清精 | 日本爽妇网 | 免费成人在线观看视频 | 激情 亚洲| 国产一级久久久 | 91精品在线观看视频 | 在线观看mv的中文字幕网站 | 国产一区在线免费观看视频 | av在观看| 久久综合导航 | 国产成人61精品免费看片 | 国产精品久久久久久久久婷婷 | 久久99久久精品国产 | 亚洲电影一区二区 | 韩国av一区二区 | 欧美 国产 视频 | 97av视频在线观看 | 欧洲不卡av | 黄色av一区二区 | 日韩视频一区二区三区在线播放免费观看 | 久久久久久久久免费 | 精品免费久久久久久 | 久久精品2 | 久章草在线观看 | 免费在线一区二区 | 麻豆视频在线播放 | 日韩一区二区久久 | 亚洲精品乱码久久久久久 | 激情伊人五月天久久综合 | 91视频黄色 | 亚洲综合网 | 国产在线黄色 | 成人9ⅰ免费影视网站 | 国产精品观看在线亚洲人成网 | 久久久久久久久免费视频 | 精品亚洲网 | 亚洲成人黄色av | 四虎影院在线观看av | 国产又粗又猛又黄又爽视频 | www.99av | 国产高清在线 | 亚洲精品欧美视频 | 中文字幕在线中文 | av电影在线观看完整版一区二区 | 最新国产福利 | 亚洲欧美婷婷六月色综合 | 伊人五月综合 | 国产精品久久久久久久99 | 97成人在线观看视频 | 日韩精品一区二区三区视频播放 | 欧美日韩国产精品爽爽 | 国产一区精品在线观看 | 国产成人黄色在线 | 九月婷婷色 | 成人91在线 | 黄视频网站大全 | 久久免费的精品国产v∧ | 日本狠狠干 | 久久精品官网 | 亚洲国产日韩欧美在线 | 欧美婷婷色 | 欧美日韩高清免费 | 麻豆91网站| av手机版| 国产久草在线 | 国产精品免费观看视频 | 国产伦精品一区二区三区在线 | 亚洲97在线 | 亚洲国产一二三 | 欧美性爽爽 | 成人在线网站观看 | 日本久久免费电影 | 天天干夜夜干 | 天天色天天草天天射 | 国产96在线 | 色婷婷狠狠五月综合天色拍 | 黄色一级免费网站 | 香蕉久草| 久久精品视频在线观看免费 | av免费在线播放 | www.在线观看av | 五月婷婷中文网 | 日韩v在线 | 免费一级片在线 | 99免费观看视频 | 91精品一区国产高清在线gif | 97电影在线看视频 | 精品久久久久久久久久久久 | 国产专区在线看 | 精品字幕| 91成熟丰满女人少妇 | 久久久久久美女 | 国产一卡久久电影永久 | 麻豆免费在线视频 | 久久国产精品影片 | 亚洲热久久 | 在线观看www视频 | 欧美精品亚洲精品日韩精品 | 精品国产区 | 久久你懂得| 操操操com| 国产伦精品一区二区三区在线 | 日韩免费电影一区二区 | 综合久色 | 99视频国产精品 | 国产麻豆视频网站 | 国产在线视频资源 | 男女全黄一级一级高潮免费看 | 国产在线观看一区 | 精品国产伦一区二区三区免费 | 特级西西444www大精品视频免费看 | 毛片888| 久久99久久99精品免费看小说 | 成人免费在线播放视频 | 日韩精品亚洲专区在线观看 | 麻花豆传媒mv在线观看 | 五月天婷亚洲天综合网鲁鲁鲁 | 视频在线精品 | 波多野结衣日韩 | 国产日韩欧美在线一区 | 深夜免费福利网站 | 国产精品久久久久久吹潮天美传媒 | 欧美成人a在线 | 中日韩欧美精彩视频 | 狠狠色丁香婷婷综合视频 | 亚洲视频 一区 | 婷婷av电影| 成人午夜电影网 | 久久久免费网站 | 国产精品日韩欧美一区二区 | 99久久精品久久亚洲精品 | 国产精品中文字幕在线播放 | 999成人国产 | 永久免费视频国产 | 日韩电影中文字幕在线观看 | 亚洲精品国产精品国自产观看 | 99高清视频有精品视频 | 91在线最新| 日韩网站在线免费观看 | 超碰97国产精品人人cao | 国产在线免费 | 8x8x在线观看视频 | 在线观看第一页 | 毛片网站观看 | 欧美日韩性生活 | 天天摸夜夜操 | 国产精品欧美久久久久无广告 | 五月天六月婷 | 日韩深夜在线观看 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 一区二区三区高清不卡 | 99视频| 国产欧美三级 | 日韩视频在线不卡 | 伊人午夜视频 | 国精产品一二三线999 | 色综合久 | 国产91全国探花系列在线播放 | 91桃色免费观看 | 天天综合视频在线观看 | 全黄网站| 国产原创在线 | 国产色拍拍拍拍在线精品 | 国产91精品一区二区 | 天天爱天天舔 | 黄色软件视频大全免费下载 | 伊人五月在线 | av线上看 | 99久国产 | 日韩欧美xx| 99视频黄 | 狠狠的干狠狠的操 | 九九热视频在线 | 91少妇精拍在线播放 | 久久久精品视频网站 | 911久久| 国产人在线成免费视频 | 天天干天天插 | 91免费日韩 | 成人91在线 | 亚洲午夜精品电影 | 久久视频这里有精品 | 久久久久久久国产精品视频 | 天天艹天天干天天 | 91丨九色丨国产丨porny精品 | 欧美黄在线| 国产91全国探花系列在线播放 | 成人免费影院 | 久久99久久精品国产 | 日韩一区在线免费观看 | 国产经典 欧美精品 | 日韩精品不卡在线观看 | 久精品在线观看 | 久草在线欧美 | 日韩av在线资源 | 免费av网址在线观看 | 欧美国产日韩一区二区三区 | 亚洲麻豆精品 | 国产精品一区二区三区在线看 | 久久精品爱爱视频 | 欧美久久久 | 一级成人网| 国产在线精品一区二区 | 又色又爽又黄高潮的免费视频 | 国产精品一区专区欧美日韩 | 国产又粗又硬又长又爽的视频 | 欧美国产91 | 天天激情站 | 午夜久久精品 | 欧美99热 | 99免费观看视频 | 99免费在线观看 | 蜜臀久久99精品久久久无需会员 | 蜜臀av夜夜澡人人爽人人桃色 | 91毛片视频| 免费在线观看黄网站 | 久久综合婷婷国产二区高清 | 黄色网www| 高清视频一区二区三区 | 久久免费精品国产 | 免费能看的黄色片 | 欧美 亚洲 另类 激情 另类 | 欧美巨大| 免费在线精品视频 | 中文久久精品 | 国产精品久久一区二区三区不卡 | 欧美性生活一级片 | 婷婷丁香花五月天 | 狠狠色丁香九九婷婷综合五月 | 精品一二 | 国内精品视频一区二区三区八戒 | 亚洲美女免费精品视频在线观看 | 久久精品久久精品久久39 | 久久综合干 | 欧美一级电影免费观看 | a资源在线 | 精品国产电影一区 | 中文字幕在线免费97 | 国产麻豆电影在线观看 | 夜夜夜草 | 18女毛片 | 天天夜夜狠狠操 | 久久免费av电影 | 亚洲精品美女久久久久网站 | 天天干天天操天天入 | 国产高清免费 | 久草在线视频免费资源观看 | www最近高清中文国语在线观看 | 日韩精品一区二区电影 | 麻豆视频免费在线观看 | 中文字幕人成不卡一区 | 精品美女在线视频 | 综合国产在线观看 | 成人免费在线观看入口 | 午夜美女wwww | 国产精品一区二区av影院萌芽 | 国产亚洲情侣一区二区无 | 国产女教师精品久久av | 亚洲国产中文字幕在线 | 一级黄色片网站 | 亚洲黄色a| 久久精品综合一区 | 黄色av三级在线 | 精品美女久久久久久免费 | 91成人天堂久久成人 | 欧美男女爱爱视频 | 日韩网站在线 | 91九色蝌蚪国产 | 九九热1 | 深爱开心激情 | 在线小视频| 亚洲精品动漫久久久久 | 国产成人精品av在线 | 狠狠色丁香婷婷综合 | www.夜夜骑.com | 精品国产成人av在线免 | 99久久精品一区二区成人 | 国产高清无av久久 | 日韩av电影免费观看 | 成人午夜电影在线播放 | 成人资源在线观看 | 蜜桃视频日韩 | 超碰在97| 亚洲日本在线视频观看 | 亚洲激情国产精品 | 91九色蝌蚪视频在线 | 久久久免费毛片 | 在线观看av免费观看 | 波多野结衣电影一区 | 久久久久久久久精 | 国产在线精 | 亚洲艳情 | 色婷婷综合在线 | 国产1区在线观看 | 麻豆激情电影 | 欧美一级视频免费 | 日本精品久久久久 | 五月婷婷综合久久 | v片在线播放 | 天天天天爱天天躁 | www.com在线观看| av在线电影网站 | 欧美激情视频一二三区 | 国产在线91精品 | 日韩免费一区 | 中文字幕人成一区 | 狠狠操操 | 日韩av电影免费在线观看 | 亚洲国产高清在线 | 中文字幕91| 成人sm另类专区 | 国产黄视频在线观看 | 成人黄色小说在线观看 | 天天综合天天做天天综合 | 国内丰满少妇猛烈精品播 | 激情五月综合网 | 干 操 插| 国产精品人人做人人爽人人添 | 国产一级黄色电影 | 国产成人久久久久 | 成人精品视频久久久久 | 欧美日韩高清在线 | 狠狠狠狠狠狠狠狠 | 韩日av在线| 成人国产精品一区二区 | 99久久国产免费,99久久国产免费大片 | 精品免费观看视频 | 国产成人高清在线 | 欧美专区国产专区 | 久久精品久久99精品久久 | 色av婷婷| 国产福利午夜 | 国产91大片 | 国产资源网站 | 欧美一级大片在线观看 | 久久视频精品在线观看 | 久草视频视频在线播放 | 日韩精品电影在线播放 | 天天爽夜夜爽人人爽一区二区 | 91亚洲网站 | 欧美不卡在线 | 狠狠伊人 | 日本精品va在线观看 | 国产精品久久久久一区二区 | 中文字幕日韩一区二区三区不卡 | 在线99视频 | 久久99久久99精品免费看小说 | av在线不卡观看 | 久香蕉 | 欧美日韩久久不卡 | 日韩久久电影 | 久久av网址 | 黄色在线观看免费网站 | 欧美性黑人| 黄色av电影网 | 国产污视频在线观看 | av大片免费 | 久久久黄色免费网站 | 欧美日本一区 | 久久国语露脸国产精品电影 | 亚洲精品www | 国产精品精品久久久久久 | 亚洲精品88欧美一区二区 | 日韩午夜视频在线观看 | 欧美精品亚洲精品日韩精品 | 天天射天天舔天天干 | 九九色网| a黄色大片 | 黄污网站在线观看 | 日韩av免费大片 | 91香蕉嫩草 | 91精品国产一区二区在线观看 | 国产精品美女免费 | 亚洲欧洲精品一区二区 | 亚洲国产中文字幕 | 亚洲欧美在线视频免费 | 在线亚洲午夜片av大片 | 精品九九九 | 日日爽天天爽 | 欧美精品免费在线观看 | 国产精品久久久久久久妇 | 九九免费精品视频在线观看 | 国产日韩精品在线观看 | 国产 欧美 在线 | 97电影在线看视频 | 91亚洲精品在线观看 | 四虎成人精品永久免费av九九 | 91免费版在线 | 欧美精品999| 日韩高清免费无专码区 | 亚洲精品视频一 | 久久爱www.| 亚洲视频电影在线 | 最近的中文字幕大全免费版 | 国产在线精品区 | 男女免费视频观看 | 91在线免费视频观看 | 国产成人精品av久久 | 久久99国产精品久久99 | 精品美女久久久久久免费 | 国产福利不卡视频 | 成人免费视频视频在线观看 免费 | 国产亚洲视频在线 | 亚洲视频综合 | 日韩欧美在线观看一区二区三区 | 韩国av一区二区三区 | 婷婷日日 | 日韩精品免费一线在线观看 | 天堂va在线高清一区 | 韩国三级一区 | 亚洲 综合 专区 | 97精品电影院 | 午夜在线观看影院 | 免费黄色av | 97在线超碰 | 国产午夜麻豆影院在线观看 | 天天躁日日躁狠狠躁 | 国产精品九九久久久久久久 | 欧美日韩二区在线 | 精品国产一区二区三区男人吃奶 | 中文字幕成人av | 99产精品成人啪免费网站 | av在线播放亚洲 | 欧美视频在线观看免费网址 | 一区二区三区动漫 | 日本激情动作片免费看 | 国产精品xxxx18a99| 天天射狠狠干 | 97免费在线视频 | 在线亚洲人成电影网站色www | 天天天干夜夜夜操 | 麻豆精品国产传媒 | 成人av在线看 | 国际精品网| 欧美一级电影在线观看 | 日韩免费在线观看 | www.久久久| 久草在线费播放视频 | 久久字幕 | 91在线精品一区二区 | 91精品国产综合久久婷婷香蕉 | 日本黄色免费在线观看 | 天天天干天天射天天天操 | 日韩一级电影在线观看 | 夜夜狠狠| 91看毛片| 久久久久电影 | 久久成人午夜 | 人人插人人射 | 国产欧美精品一区二区三区 | 国产精品黄网站在线观看 | 亚洲好视频 | 成人三级黄色 | 国产精品久久久久久麻豆一区 | 精品网站999www | 欧美精品一级视频 | 欧美aaaxxxx做受视频 | 国模精品一区二区三区 | 国外av在线 | 美女久久视频 | 日本最新高清不卡中文字幕 | 国产成人高清在线 | 天天色 天天| 麻豆传媒电影在线观看 | 国产视频 久久久 | 91毛片在线 | 96av麻豆蜜桃一区二区 | 国产乱码精品一区二区蜜臀 | 新版资源中文在线观看 | 欧美日韩视频免费 | 五月婷婷中文网 | 亚洲日本欧美在线 | 九九热精品视频在线观看 | 日韩av黄| 精品国产一区二区三区四区在线观看 | 欧美精品久久久久久久久久白贞 | 99婷婷| av免费网站观看 | 日韩字幕 | 在线视频婷婷 | 91看片一区二区三区 | 欧美日韩一区二区在线观看 | 五月激情片 | 黄色录像av | 人人干人人草 | 日韩精品中文字幕av | 97热在线观看| 黄色亚洲大片免费在线观看 | 日韩av片无码一区二区不卡电影 | 亚洲国产三级 | 国产日韩欧美在线播放 | 最近中文字幕高清字幕在线视频 | 国内精品久久久久久久影视简单 | 国产精品亚洲a | 激情影音先锋 | 天天激情站 | 五月婷婷六月丁香 | 亚洲精品看片 | 91福利社区在线观看 | 国产人成免费视频 | 日韩av不卡在线 | 五月天av在线| 日本成人黄色片 | 在线播放91 | 91精品久久久久久久久久入口 | 久久久久免费看 | 在线免费91 | 久久久精品在线观看 | 天天曰视频 | 久久久亚洲国产精品麻豆综合天堂 | 97视频在线免费观看 | 91探花国产综合在线精品 | 日韩欧美一区二区在线播放 | 岛国精品一区二区 | 色婷婷综合视频在线观看 | 成+人+色综合 | 久久国产精品一二三区 | 久久久99精品免费观看 | 中文字幕91在线 | 在线国产黄色 | 久久精品久久久久 | 午夜精品久久久久久中宇69 | 久久久999免费视频 日韩网站在线 | 久久专区 | 最近中文字幕第一页 | 亚洲五月综合 | 91在线永久| 久久综合桃花 | 国产原创91| 九九热1| 亚洲精品网站在线 | 日韩av手机在线观看 | 夜夜高潮夜夜爽国产伦精品 | 在线国产一区 | 国产a精品 | 久久夜视频 | 欧美日韩在线第一页 | 97人人爽人人 | 婷婷色在线视频 | 久久综合九色综合久99 | 久久99久国产精品黄毛片入口 | 婷婷丁香五| 中文字幕亚洲高清 | 日韩大陆欧美高清视频区 | 91精品少妇偷拍99 | 婷婷在线色 | 日本成址在线观看 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 91系列在线观看 | 免费a网站 | 四虎国产精品成人免费影视 | 久久男人中文字幕资源站 | www.久久婷婷 | 精品一二 | 91色蜜桃 | av电影免费在线看 | 九九九国产 | 国产精品毛片一区二区三区 | 国产偷国产偷亚洲清高 | 午夜精品久久久久久99热明星 | 久操中文字幕在线观看 | 日韩动漫免费观看高清完整版在线观看 | 久久精品视频免费 | 一区二区三区高清在线观看 | 欧美综合在线视频 | 在线电影av | 精品久久久久久亚洲综合网站 | 色香蕉在线视频 | av大全免费在线观看 | 免费a v观看 | 国产精品一区二区吃奶在线观看 | 欧美视频一区二 | 天天爱天天干天天爽 | 欧美久久99 | 亚洲 综合 激情 | 欧美日韩中文字幕视频 | 国产中文字幕在线 | 蜜桃视频日本 | 96av麻豆蜜桃一区二区 | 中文字幕成人在线观看 | 精品视频999| 婷婷丁香色 | 国产精品女同一区二区三区久久夜 | 正在播放一区二区 | 欧美va电影 | 久久精品视频网 | 99亚洲精品视频 | 91视频一8mav| 亚洲精品乱码久久久久久9色 | 欧美日韩不卡一区二区三区 | www.com久久久 | 成 人 黄 色 视频 免费观看 | 亚洲欧美日韩不卡 | 欧美日韩免费一区二区 | 国产精品精品久久久久久 | 亚洲美女视频在线 | 国产在线观看免费观看 | 在线电影 一区 | 丁香久久久 | 国产91勾搭技师精品 | 色婷婷在线播放 | 国产精品日韩久久久久 | 国产中文字幕在线观看 | 一区二区三区影院 | 一区二区影院 | 久草在线视频资源 | 久久久久久久国产精品视频 | 日韩中文字幕免费视频 | 日本巨乳在线 | 国产精品国产三级在线专区 | 国产日韩在线观看一区 | 久久精品中文视频 | 99色| 色在线国产 | 精品视频在线观看 | 51久久成人国产精品麻豆 | 久久激情视频免费观看 | 国产在线观 | 久久综合狠狠综合 | 午夜精品视频福利 | 国产黄色片免费 | 九九久久久久久久久激情 | 在线三级av | 天天插狠狠插 | 正在播放国产精品 | 精品爱爱 | 色成人亚洲网 | 国产不卡片 | 奇米四色影狠狠爱7777 | 97高清视频 | 青草视频在线播放 | 久久久久久久久影院 | 99视频播放| 欧美日韩在线观看一区二区 | 久久视了 | 国产一在线精品一区在线观看 | 日本久久精品 | 99资源网 | 在线免费观看国产视频 | 婷婷激情欧美 | 人人插人人插 | 色九九视频 | 99久久999久久久精玫瑰 | 欧美亚洲久久 | 免费精品在线 | 99免在线观看免费视频高清 | 精品国产一区二区三区噜噜噜 | 又大又硬又黄又爽视频在线观看 | www狠狠操 | 精品自拍sae8—视频 | a视频在线观看免费 | 久久久久久国产精品 | 久久国产福利 | 欧美一二区在线 | 久久国产精品二国产精品中国洋人 | 国产成人在线观看 | 亚洲视频电影在线 | 国产小视频在线观看免费 | 99人久久精品视频最新地址 | 久草网站在线观看 | 99精品欧美一区二区蜜桃免费 | 日韩视频在线观看视频 | 国产免费精彩视频 | 亚洲精品自拍视频在线观看 | 免费色av| 性色av一区二区三区在线观看 | 日韩视频图片 | 久久免费看毛片 | 伊人干综合 | 欧美高清视频不卡网 | 国产视频久 | 久久久黄视频 | 国产91丝袜在线播放动漫 | 免费av网站观看 | 天天躁日日躁狠狠躁av中文 | 91亚洲免费 | 国产精品国产三级国产专区53 | 一区二区伦理 | 成人9ⅰ免费影视网站 | 在线观看黄色国产 | www.eeuss影院av撸| 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | www.com久久久 | 日韩精品黄 | 97国产在线视频 | 欧美精品乱码久久久久 | 日韩欧美国产精品 | 五月婷婷视频在线观看 | 国产人成看黄久久久久久久久 | 人人插人人舔 | 亚洲精品九九 | 国产视频一区二区在线观看 | 美女中文字幕 | 亚洲永久精品在线观看 | 国产在线理论片 | 国产精品九九久久久久久久 | 欧美色一色 | 开心激情综合网 | 天天色宗合 | 日韩中文幕 | 日韩精品一区电影 | 久久99欧美 | 二区视频在线观看 | 91国内产香蕉| 亚洲精品一区二区三区新线路 | 天天干,天天草 | 天天操天天射天天爽 | 九九综合在线 | 久久国产手机看片 | 久色小说 | 日本成人免费在线观看 | 亚洲v欧美v国产v在线观看 | 欧美一级在线 | 日韩av播放在线 | 国产麻豆精品在线观看 | 国产一级一片免费播放放 | av高清一区二区三区 | 97超碰国产在线 | 五月婷婷六月综合 | 碰超人人 | 色多多在线观看 | 久久久黄色 | 成人啊 v | 成 人 黄 色 视频播放1 | 一区二区激情 | 国产成人久久av977小说 | 亚洲视频久久 | 人人爱爱 | 亚洲成人高清在线 | 色综合久久久久久久久五月 | 色在线国产 | 亚洲精品高清一区二区三区四区 | 国产伦理一区二区三区 | 亚洲人成网站精品片在线观看 | 丁香花在线观看视频在线 | 最近2019中文免费高清视频观看www99 | 午夜美女影院 | 色婷婷狠狠18| 黄色福利网 | 97国产在线播放 | www.黄色 | 国产又黄又爽又猛视频日本 | 久久精品久久精品久久精品 | 日韩a欧美 | 在线欧美a | 色综合久久综合中文综合网 | 日韩黄色中文字幕 | 久久久影视| 伊甸园永久入口www 99热 精品在线 | 日韩成人免费在线 | 福利视频导航网址 | 在线a人片免费观看视频 | 久久99精品国产91久久来源 | 亚洲精区二区三区四区麻豆 | 91精品在线免费 | 九九综合九九综合 | 亚洲 欧美 综合 在线 精品 | 久久精品99视频 | 免费看的黄色网 | 最新国产一区二区三区 | 99产精品成人啪免费网站 | 99久久久久久 | 欧美一进一出抽搐大尺度视频 | 国产我不卡 | 国产精品欧美久久 | 丝袜美腿av | 99精品视频中文字幕 | 国产精品18久久久久白浆 | 成人黄色大片在线免费观看 | 亚洲国产精品小视频 | 日韩 精品 一区 国产 麻豆 | 福利视频一区二区 | 亚洲人视频在线 | 97视频在线观看网址 | 久久9精品 | 黄色一及电影 | 人人爽爽人人 | 美女久久久久久久久久 | 久草视频资源 | 日韩三级视频在线观看 | 伊人久久av | 成片人卡1卡2卡3手机免费看 | 久久精品国产一区 | 久久久99精品免费观看app | 国产欧美日韩视频 | 久久精品官网 | 亚洲香蕉在线观看 | 久久久久久高潮国产精品视 | 亚洲最新精品 | 最近最新最好看中文视频 | 国产成人av电影在线观看 | 国产高清视频在线播放一区 | 波多野结衣一区三区 | 国产91九色视频 | 最近日本韩国中文字幕 | 五月导航| 亚洲精品久久久久中文字幕二区 | 免费在线成人av电影 | 久久成人国产精品免费软件 | 激情一区二区三区欧美 | 亚洲精品视频在线观看免费视频 | 激情综合色综合久久综合 | av免费观看高清 | 日韩欧美区 | 91欧美日韩国产 | 丁香六月欧美 | 国产日韩精品一区二区 | 五月开心激情网 | 成人精品视频 | 91在线观看欧美日韩 | 日韩欧美在线第一页 | 中文国产在线观看 | 日本在线观看一区 | 狠狠干天天色 | 日批视频在线播放 | 毛片激情永久免费 | 亚洲精品动漫久久久久 | 国产色爽 | 国产一区免费在线观看 | 久久国产成人午夜av影院宅 | 天天插天天干 | 91在线在线观看 | 午夜精品福利一区二区三区蜜桃 | 国产一区二区三区免费观看视频 | 久久亚洲精品国产亚洲老地址 | 美女一二三区 | 天天射天天爱天天干 | 欧美一级免费高清 | 日韩av免费一区二区 | 日韩欧美在线高清 | 亚洲精品美女久久久久网站 | 亚洲精品字幕在线观看 | 精品毛片一区二区免费看 | 久久久久中文字幕 | 成人一级影视 | 91大神dom调教在线观看 | 五月婷婷久久综合 | 久久另类小说 | 精品国产成人av在线免 | 天天操夜夜干 | 久久久片 | 国产黄色精品 | 成人黄视频 | 中文字幕在线一区观看 | 66av99精品福利视频在线 | 国产性xxxx| 91精品国产99久久久久久久 | 91在线资源 | av黄色成人 | 亚洲理论电影 | 日韩av不卡播放 | 97免费| 奇米网8888 | 又长又大又黑又粗欧美 | 有码中文字幕在线观看 | 四虎免费av | 最近中文字幕免费视频 | 99精品视频一区 | 久久国产品| 成人综合免费 | 2021国产精品 | 玖玖综合网 | 91亚洲精品久久久久图片蜜桃 | 久久久黄视频 | 五月婷婷网站 | 日韩欧美精品在线 | 中文字幕二区三区 | 色综合 久久精品 | 久久,天天综合 | 日韩成人免费在线观看 | 国产在线观看中文字幕 | 日韩有色 | 蜜臀av网站| 韩国av免费看 | 色搞搞| 久久好看免费视频 | 国产一区二区不卡在线 | 一区二区高清在线 | 日韩精品一区二区三区外面 | 在线精品亚洲 | 在线小视频 | 色国产精品 | 日韩欧美专区 | 国产最新在线视频 | 久久av观看 | 国产视频九色蝌蚪 | 99精品在线免费在线观看 | 中文字幕不卡在线88 | 六月丁香婷 | 欧美少妇xxx| 亚洲女人天堂成人av在线 | 亚洲 欧美 变态 国产 另类 | 国产日韩欧美在线看 | 欧美精品一区二区三区四区在线 | 成人黄色资源 | 一级一片免费观看 | 在线亚洲欧美视频 | 激情欧美一区二区三区免费看 | 丁香综合网 | 亚洲视频在线免费观看 | 国产精品久久久久av免费 | 黄色软件视频网站 | 免费黄在线观看 | 久久国产精品网站 | 欧美在线日韩在线 | 国产偷国产偷亚洲清高 | 在线小视频你懂的 |