? ? 回調(diào)地域:
????????與后臺發(fā)生數(shù)據(jù)交互的時(shí)候,ajax的請求回調(diào)中還有一個或者是多個ajax請求,這樣的現(xiàn)象就形成了回調(diào)地域。
????????缺點(diǎn):代碼復(fù)雜,所有的請求一環(huán)套一環(huán)。邏輯不清晰,不方便閱讀同時(shí)也不利于調(diào)試。(ajax破壞了json的調(diào)試機(jī)制)
????????解決辦法:promise
1.promise(保證,承諾,允諾)
?? ? 作用:(1)答應(yīng)某件事情,承諾去做某件事情
?? ??? ??? ?? ? (2)用于解決回調(diào)地域的現(xiàn)象?;卣{(diào)地域一般出現(xiàn)在ajax請求當(dāng)中
?? ?? ? 三種狀態(tài):
?? ??? ??? ??? ?? ? (1).承諾的事情在進(jìn)行中
?? ??? ??? ??? ?? ? (2).承諾的事情沒有完成
?? ??? ??? ?? ? ?? ?(3).承諾的事情已經(jīng)完成了
?? ?? ? 誰去允諾?做什么事情?完成的情況?
?? ??? ?? ? 對象———執(zhí)行代碼---返回結(jié)果
?? ??? ??? ?? ? 允諾步驟:
?? ??? ??? ??? ??? ??? ?? ? (1)創(chuàng)建一個允諾對象?? ??? ??? ?兩個參數(shù)(成功,失?。?/p>
?? ??? ??? ??? ??? ??? ??? ??? ?? ? var pro= new promise(function(success,failed){
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?? ? //執(zhí)行承諾的事情的過程有三種狀態(tài)
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?? ??? ??? ??? ??//(1).承諾的事情在進(jìn)行中(pending)
?? ??? ??? ??? ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??//(2).承諾的事情沒有完成 (rejected)
?? ??? ??? ?? ??? ?? ??? ??? ??? ??? ??? ??? ??? ?? ? ?//(3).承諾的事情已經(jīng)完成了(resolved)
?? ??? ??? ??? ??? ??? ??? ??? ?});
?? ??? ??? ??? ??? ??? ??? ??? ?? ? pro下有一個“.then”方法,.then方法還可以接收一個回調(diào)
?? ??? ??? ??? ??? ??? ??? ??? ?? ? pro.then(function(res){
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?? ? //接收成功回調(diào)傳遞回來的結(jié)果,結(jié)果保存在res中
?? ??? ??? ??? ??? ??? ??? ?},function(err){
?? ??? ??? ??? ??? ??? ??? ??? ??? ?? ? //接收失敗的信息,這樣的表達(dá)不會報(bào)錯。
?? ??? ??? ??? ??? ??? ??? ??? ??? ?}).then(function(res/err){
?? ??? ??? ??? ??? ??? ?});
?? ??? ??? ??? ??? ??? ??? ??? ?? ? 回調(diào)函數(shù)內(nèi)可以無限寫的then方法,每一次返回的結(jié)果就是上一個then方法執(zhí)行出來的結(jié)果
?? ??? ??? ??? ??? ??? ??? ??? ?? ??“.catch”方法。接收失敗回調(diào)傳遞回來的結(jié)果,保存在 err
?? ??? ??? ??? ??? ??? ??? ??? ?? ? pro.catch(function(err){
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?? ? //catch方法接收失敗回調(diào)傳回來的結(jié)果,保存在err
?? ??? ??? ??? ??? ??? ??? ??});
2.對象(面向?qū)ο箝_發(fā))
? ? (1)對象和類
?? ??? ??? ?? ? 對象:當(dāng)我們要使用一些方法時(shí),這些方法都是存在某個對象下,有了對象才能使用方法
?? ??? ??? ??? ??? ??? ?? ? 對象從何而來?
?? ??? ??? ??? ??? ??? ??? ??? ?? ? 通過new一個構(gòu)造函數(shù),得到一個對象。
?? ??? ??? ??? ??? ??? ?? ? 什么是構(gòu)造函數(shù)?
?? ??? ??? ??? ??? ??? ??? ??? ?? ? 構(gòu)造函數(shù)就是傳說中的類,我們只能按照類的方法去理解.(js中沒有明確的面向?qū)ο蟮恼f法)
?? ??? ??? ??? ??? ??? ?? ? 類和對象的關(guān)系:先有類才有具體的對象。
?? ??? ?? 例:
?? ??? ??? ??? ?? ? 要創(chuàng)建很多同一類型的對象,會寫很多重復(fù)的代碼
?? ??? ??? ??? ?? ? 要解決這個代碼重復(fù)的問題
?? ??? ??? ??? ?? ? 就要應(yīng)用到面向?qū)ο蟮姆绞絹硖幚?/p>
? ? (2)面向?qū)ο螅嫦驅(qū)ο笫且环N高級的編程開發(fā)思想)
面向?qū)ο缶碗x不開this指向問題
?this回顧
? ? ? ? ?a.this指向離不開事件調(diào)用,函數(shù)創(chuàng)建的時(shí)候就產(chǎn)生一個this指向
? ? ? ? ?b.(誰調(diào)用就指向誰)當(dāng)有時(shí)間綁定,并執(zhí)行了事件處理程序時(shí),誰綁定的事件,事件處理程序中的this就指向誰
? ? ? ? ?c.回調(diào)函數(shù)中的this指向window
? ? ? ? ?d.匿名函數(shù)可以使用bind( )改變this的指向
? ? ? ? ? ? ? ? ?call( )和apply( )可以改變函數(shù)中的this指向
? ? ? ? ?e.箭頭函數(shù)本身沒有this,它的this是繼承父級而來
? ? ? ? ?f.箭頭函數(shù)不能使用call( ),apply( ),bind( ),方法來改變this指向
? ? ? ? ?g.嚴(yán)格模式下,全局函數(shù)的this是undefined
? ? ? ? ?h.面向?qū)ο笙碌囊恍﹖his
?? ?? ? ? ?對象通俗的解釋就是:?萬事萬物皆為對象
?? ??? ?? ? 面向?qū)ο缶褪莿?chuàng)造一出一個類,給到具體對象使用
開發(fā)思想說明:
? ? ? ? 把一個功能或者共有的屬性,進(jìn)行封裝,形參一中了類型,通過這種類型可以創(chuàng)建無數(shù)個具體的對象,
????????這些對象就可以使用這種類型的屬性和方法。
?? ??? ?? ? 使用工廠模式來封裝一種類型。
? ? ? ? ? ? a.工廠模式封裝:
????? ??? ??? ??function Person(name,age,sex){
?? ??? ??? ??? ?? ? //屬性
????????? ??? ??? ??var obj = new Object();
????????? ??? ??? ??obj.name = name;
????????? ??? ??? ??obj.age = age;
????????? ??? ??? ??obj.sex = sex;
?? ??? ??? ??? ?? ? //方法
?????????? ??? ??? ?obj.eat = function(){
?????????????? ??? ?return this.name + "在吃飯";
???????? ??? ??? ???}
????????? ??? ??? ??return obj;
?????? ??? ??? ?}?? ??? ?
?? ??? ?? ? 優(yōu)點(diǎn):
?? ??? ??? ??? ?? ? 解決了創(chuàng)建多個同類對象代碼重復(fù)問題
?? ??? ?? ? 缺點(diǎn):
?? ??? ??? ??? ?? ? 這個對象所屬類型不明確
?? ??? ??? ??? ?? ? 寫法不規(guī)范
?? ??? ?? ? 什么是構(gòu)造函數(shù)?
?? ??? ??? ??? ?? ? 簡單來說能產(chǎn)生對象的一個函數(shù)就是構(gòu)造函數(shù),構(gòu)造函數(shù)本身也是一個函數(shù)? ??
?? ??? ?? ? b.構(gòu)造函數(shù)方式
?? ??? ??? ??? ?? ? 構(gòu)造的函數(shù)首寫字母一般大寫,這個是約定俗稱的用于跟普通函數(shù)區(qū)分
?? ?? ???? ?? ? 構(gòu)造函數(shù)的語法:
?? ??? ??? ?? ? function Person(name, age,sex){//構(gòu)造函數(shù)的實(shí)例類型
?? ??? ??? ?? ? //屬性
?? ??? ??? ?? ? this.name=name; ? //實(shí)例屬性
?? ??? ??? ?? ? this.age=age;?? ?? ? //實(shí)例屬性
?? ?? ? ? ? ? ? this.sex=sex;?? ?? ? //實(shí)例屬性
?? ??? ??? ?? ? //方法
?? ??? ??? ?? ? this.eat=function( ){ ?//實(shí)例方法
?? ??? ??? ??? ??? ?? ? return? ? this.name+”在吃飯”;? ?
?? ??? ?}
?? ??? ??? ?? ? this.say=function(){ ?//實(shí)例方法
?? ??? ???? ??? ??? ?? ? return? ?this.name+”說:今年我”+this.age+”歲了”;
?? ??? ??}
}
?? ??? ??? ?? ? //對象
?? ??? ??? ?? ? var zs=new Person(?“張三”,20,“男”);//實(shí)例對象
?? ??? ??? ?? ? var lisi=new Person(“李四”,18,“女”) ;//實(shí)例對象
?? ??? ??? ?? ? 實(shí)例屬性:
?? ??? ??? ??? ??? ?? ? 在構(gòu)造函數(shù)內(nèi)部定義的屬性交實(shí)例屬性
?? ??? ??? ?? ? 實(shí)例方法:
?? ??? ??? ??? ??? ?? ? 在構(gòu)造函數(shù)內(nèi)部定義的方法叫實(shí)例方法
?? ??? ??? ?? ? 優(yōu)點(diǎn):
?? ??? ??? ??? ??? ??? ? 解決了創(chuàng)建多個同類對象代碼重復(fù)問題?
?? ??? ??? ??? ??? ?? ? ?解決了對象所屬不明確的類型
?? ??? ??? ??? ??? ?? ? ?代碼規(guī)范
?? ??? ??? ?? ? 缺點(diǎn):
?? ??? ??? ??? ??? ?? ? 實(shí)例方法在內(nèi)存空間占據(jù)的空間會很多,每new實(shí)例對象就會在內(nèi)存中開辟一個函數(shù)的空間
?? ??? ??? ??? ???來存放一個函數(shù),這樣的函數(shù)一般都是給所有的實(shí)例對象使用。這些方法都是公共的所以這里浪費(fèi)了內(nèi)存資源。
? ? ? ? c.構(gòu)造函數(shù)的原型
?? ??? ?? ? 原型(prototype)是一個對象保存,同時(shí)在另外一個空間里面也叫原型空間
?? ??? ??? ?? ? .prototype
?? ?? ? ? ? ? ? 是構(gòu)造函數(shù)下的原型對象。(是以屬性的情況存在)
?? ??? ??? ?? ? 可以在原型下面創(chuàng)建屬性跟方法
?? ??? ??? ?? ? 例如:
?? ??? ??? ??? ?? ? Person.prototype.phone=“122312312312312”;//原型屬性
?? ??? ??? ??? ?? ? Person.prototype.eat=function( ){return this.eat( );}//原型方法
?? ??? ??? ?? ? (原型只能直接被修改)
?? ??? ??? ?? ? 原型下的屬性和方法被所有的實(shí)例對象共享,一個改了,大家都改了。
? ? ? ? d.完整的面向?qū)ο蠓绞剑ɑ旌蠈ο蠓绞剑?/p>
?? ??? ??? ?? ? 私有(實(shí)例對象)的屬性寫在實(shí)例屬性里面。
?? ??? ??? ?? ? 共有(實(shí)例方法)的方法寫在原型下面。