1、對象:程序中描述現(xiàn)實中一個具體事物的屬性和方法的結(jié)構(gòu)
2、面向?qū)ο螅∣OP)
面向?qū)ο蟪绦蛑?,描述一個具體事物都要用對象來封裝事物的屬性和功能,寫任何程序都要先找對象,再識別對象的屬性和功能;
面向?qū)ο缶幊碳夹g(shù)的關(guān)鍵性觀念是它將數(shù)據(jù)及對數(shù)據(jù)的操作行為放在一起,作為一個相互依存、不可分割的整體——對象。對于相同類型的對象進行分類、抽象后,得出共同的特征而形成了類。面向?qū)ο缶幊叹褪嵌x這些類。
面向?qū)ο笕筇攸c:
封裝:將描述一個事物的屬性和方法集中定義在一個對象中;
Why:單獨的屬性和方法是沒有意義的,只有放在對象上才有意義
便于反復(fù)調(diào)用——代碼重用,便于維護
多態(tài):重寫(實現(xiàn)子對象與父對象的差異)和重載(便于調(diào)用)
重寫:如果子對象覺得父對象的方法不好用,可以在子對象定義同名方法, 就會覆蓋父對象中的同名方法
重載:相同名稱,不同參數(shù)列表的多個函數(shù);在調(diào)用時可根據(jù)傳入?yún)?shù)的不 同,動態(tài)選擇對應(yīng)的函數(shù)執(zhí)行;
雖然js語法默認(rèn)不支持重載,但可用arguments對象(類數(shù)組對象, 調(diào)用時自動創(chuàng)建并接收所有傳入的參數(shù)值)模擬重載效果;
何時使用重載:只要多個操作共用同一個函數(shù)名時
繼承:父對象中的屬性和方法,子對象可直接使用
Why:代碼重用,節(jié)約內(nèi)存空間,便于維護
?? Js中的繼承都是通過原型(_proto_)實現(xiàn)的
3、作用域與作用域鏈
作用域:一個變量的可用范圍,實際就是變量的實際存儲位置;
作用域的本質(zhì):EC對象(執(zhí)行環(huán)境對象)的一個scope屬性,引用了window或AO對象(活動對象,專門保存本次函數(shù)調(diào)用時的局部變量),只可能是window中(全局作用域——全局變量)或AO中(函數(shù)作用域——局部變量);
作用域鏈:以當(dāng)前EC的scope屬性為起點依次引用每個AO,直到window結(jié)束,形成的多級引用關(guān)系。(只要在作用域鏈上存在的變量,當(dāng)前函數(shù)都可使用)
4、原型和原型鏈
原型:prototype,保存所有子對象共有屬性值的父對象。(每個(構(gòu)造)函數(shù)都自帶一個prototype對象,所有被構(gòu)造函數(shù)創(chuàng)建的子對象都有一個_proto_屬性指向構(gòu)造函數(shù)的prototype對象)
原型鏈:由各級子對象的_proto_屬性連續(xù)引用形成的結(jié)構(gòu),所有對象都有_proto_,所有對象原型鏈的頂部都是Object.prototype
5、閉包
閉包:內(nèi)外層函數(shù)嵌套;內(nèi)層函數(shù)必須使用了外層函數(shù)的局部變量;外層函數(shù)將內(nèi)層函數(shù)返回到外部,可以在外部調(diào)用;
何時使用閉包:想反復(fù)使用一個局部變量,且不希望被污染時,就要用閉包結(jié)構(gòu)保護局部變量。
閉包缺點:比普通函數(shù)占用更多的內(nèi)存空間(外層函數(shù)的AO)
如何使用閉包:3步
? ? a、定義外層函數(shù)(工廠函數(shù));? ? ? ? ? 特點:定義了受保護的局部變量? ? ? ? ? ? ? ? ? ? ? 返回一個專門操作局部變量的內(nèi)部函數(shù)對象
? ? b、調(diào)用外層函數(shù)(工廠函數(shù)),獲得返回的內(nèi)部函數(shù)對象;
? ? c、使用獲得的內(nèi)部函數(shù)對象,操作受保護的局部變量——唯一途徑;