面向?qū)ο?br>
* 單利模式
* 工廠模式
* 構(gòu)造函數(shù)模式
* 原型模式
* call,apply,bind
* 繼承
面向?qū)ο?/p>
對象:指的是基于對象 類 實力來研究的
類:是對對象的具體細(xì)分
實例:某一個類別種具體的事物
對象的特征:屬性 方法
面向?qū)ο蟮奶攸c
面向?qū)ο笏枷胍步校╫o思想 oop思想)
1:封裝:對同一個功能的函數(shù)刃唐,只能封裝一次,以后遇到此功能只需要調(diào)用即可界轩,無需重寫画饥。避免大量亢余代碼:低耦合,高內(nèi)聚(單利模式 工廠模式 構(gòu)造函數(shù)模式 原型模式)
2:繼承:子類可以繼承父類的屬性跟方法
3:多態(tài):多種形態(tài) ?重寫 重載
重載:js沒有嚴(yán)格意義上的重載浊猾,有類似的功能抖甘,傳不同的參數(shù),可以實現(xiàn)不同的功能
重寫:子類可以重寫父類的屬性和方法
單利模式
單例模式
1:單例模式葫慎;把描述同一個對象的屬性和方法衔彻,都放在同一個命名空間下避免全局變量的污染
和沖突
單利模式,解決了變量沖突偷办,實現(xiàn)了分類分組
命名空間: 在單利模式中艰额,我們的對象名叫做命名空間,單利模式把實現(xiàn)和描述同一件事物的屬性和方法進行分類歸納椒涯,然后匯總的同一個命名空間下柄沮,不同的命名空間互不沖突
把描述這個對象的屬性跟方法,所存放的空間废岂,起個名字
2:單利模式的本質(zhì);普通對象
模塊化開發(fā)祖搓;單利模式就是最簡單的模塊化開發(fā)
對于一個大型的項目,會分配給不同的工程師湖苞,進行同步開發(fā)拯欧;等所有人都開發(fā)完成之后,最后
進行代碼合并
3:關(guān)于單利模式的優(yōu)缺點
1 優(yōu)點:單利模式可以避免全局變量的污染和沖突
2袒啼;單利模式是最簡單的模塊開發(fā)
1)本模塊之間的相互調(diào)用 哈扮;this.屬性名
2)不同模塊之間的相互調(diào)用;模塊名.屬性名
2 缺點:會存在大量的大量亢余代碼
4:解決措施蚓再;工廠模式
這三種都是單例模式
1:var personRender={};
2:var studentRender=(function{
return {}
})()
3:function Person(){ } ?var p=new Person()
工廠模式
工廠模式的本質(zhì)-封裝
1滑肉;引進原材料 ? ? 創(chuàng)建一個空對象{} new Object()
2;加工 ? ? ? ? ?給對象添加屬性和方法
3摘仅;輸出產(chǎn)品 ? ? ? 輸出已經(jīng)加工后的對象靶庙;
5;如果想讓工廠模式的調(diào)用方式娃属,跟系統(tǒng)類的調(diào)用方式一樣需要做兩步
1)首字母大寫
2)添加new
構(gòu)造函數(shù)模式
函數(shù):
object 和function 都有一個自帶的name值指向自己
length是形參的個數(shù)
構(gòu)造函數(shù)跟工廠模式的區(qū)別
1)類調(diào)用的時候六荒;
(1)工廠模式是普通函數(shù)的調(diào)用 person()
普通函數(shù)執(zhí)行的時候沒返回值护姆,那么是undefined
(2)構(gòu)造函數(shù);new首字母大寫() new person
構(gòu)造函數(shù)執(zhí)行的時候掏击,沒返回值卵皂,那么是person{} 這個對象
構(gòu)造函數(shù)模式執(zhí)行:
- 1:創(chuàng)建一個私有作用域 - 進行形參賦值- 預(yù)解釋
- 2:new 這樣執(zhí)行,在預(yù)解釋完成后砚亭,瀏覽器默認(rèn)的在私有作用域中灯变,創(chuàng)建一個對象,函數(shù)中this指向這個對象
- 3:在和普通函數(shù)一樣捅膘,代碼從上到下執(zhí)行
- 4:new這樣執(zhí)行添祸,在代碼執(zhí)行完成之后,會默認(rèn)的把第二步種(沒有return也會默認(rèn)返回一個對象)寻仗,我們創(chuàng)建的這個對象返回
2)函數(shù)體內(nèi)的不同
工廠模式(普通函數(shù))刃泌;三步 1)創(chuàng)建對象 2)加工對象 3)返回對象
構(gòu)造函數(shù);一步加工對象
7)關(guān)于構(gòu)造函數(shù)的小細(xì)節(jié)
1署尤;構(gòu)造函數(shù)的this都是實例
2耙替;構(gòu)造函數(shù)中存放的都是私有的屬性和方法
3;實例只跟構(gòu)造函數(shù)種的this.xxx有關(guān)沐寺,跟var沒任何關(guān)系
4林艘;構(gòu)造函數(shù)中,系統(tǒng)默認(rèn)為我們創(chuàng)建一個實例混坞,并且默認(rèn)返回一個實例
5:通過構(gòu)造函數(shù)創(chuàng)建出來的實例都是相互獨立的個體,互不影響钢坦,而在構(gòu)造函數(shù)體中寫的this,xx=xx 都相當(dāng)于給當(dāng)前實例增加自己的私有屬性
不建議自己手動返回對象究孕,如果非要手動返回的話 return ?構(gòu)造函數(shù)最好不要寫return
1)返回的是基本數(shù)據(jù)類型,無效爹凹,實例該有的屬性和方法仍然有
2)返回的是引用數(shù)據(jù)類型厨诸,以前給實例添加的屬性和方法都無效了
8;構(gòu)造函數(shù)禾酱;實例和類打交道
9微酬; new Student() new Student這個new出來的實例都會執(zhí)行 在new一個實例的時候,如果不需要傳參()可以省略
10颤陶;學(xué)習(xí)構(gòu)造函數(shù)的目的
1)了解系統(tǒng)類的構(gòu)成
2)自己定義一個類颗管,并且創(chuàng)建一個實例;
11: 類是函數(shù)數(shù)據(jù)類型
實例是對象數(shù)據(jù)類型
原型模式
原型模式的基礎(chǔ)知識:
1.每個函數(shù)數(shù)據(jù)類型(普通函數(shù)滓走,類(內(nèi)置類垦江,自定義類)構(gòu)造函數(shù))上,都有一個屬性搅方,
叫做prototype比吭,prototype是個原型绽族;他的屬性值是個對象
2.prototype這個對象上,存放的都是公有的屬性和方法衩藤,
他天生自帶一個屬性
constructor(構(gòu)造函數(shù)),指向當(dāng)前這個構(gòu)造函數(shù)吧慢;
3.每個對象數(shù)據(jù)類型(實例,prototype,普通對象)上赏表,
都有一個屬性叫做__proto__,指向當(dāng)前實例所屬類的原型娄蔼;
14)Object.prototype上的方法:
in驗證某一個屬性是否屬于這個對象,不管是私有的還是公有的底哗,只要有岁诉,返回的結(jié)果都是true
hasOwnProperty():
判斷是否為對象的私有屬性
obj1.isPrototypeOf(obj2) :obj1是否在obj2的原型鏈上;
propertyIsEnumerable:是否為可枚舉的屬性
15)__proto__原型鏈:
如果想查找:對象.屬性名
1)先看該對象的私有空間中是否有跋选,如果有涕癣,說明這個屬性是私有屬性;
2)如果沒有前标,通過__proto__繼續(xù)往當(dāng)前實例所屬類的原型上找坠韩,找到了,說明是公有屬性炼列;
3)找不到繼續(xù)通過__proto__一直往上找只搁,找到基類Object.prototype原型上,還沒有的話undefined;
__proto__原型鏈this:
他們的this指向不同俭尖,但是查到找的結(jié)果都一樣
p1.hasOwnproperty() ? p1
p1.__proto__.hasOwnproperty() ?p1的原型
p1.__proto__.__proto__hasOwnproperty() object
16)
1:所有的函數(shù)數(shù)據(jù)類型氢惋,都是
function這個類的實例
2:所有的對象都是object這個基類的實例
3)function和object的關(guān)系:
(1)object instanceof function ===>true 所有類都是function這個類的實例
(2)function instanceof function ===>true 所有的對象都是object這個基類的實例
(3)object.prototype 是function.prototype的爹 當(dāng)他的身份是函數(shù)的時候,有prototype
(4)object.prototype是function_proto_的爹 當(dāng)他為對象的時候稽犁,是有這個—proto—
4:
函數(shù)的三種角色
(1):普通函數(shù):形成私有作用域-形參賦值-預(yù)解釋-代碼從上到下執(zhí)行 以及內(nèi)存和內(nèi)存的釋放
(2):構(gòu)造函數(shù):實例 類 原型 —proto—
(3):對象:跟普通對象的功能一模一樣
1焰望;在ie瀏覽器下,禁止用戶通過__proto__去修改實例上公有的屬性和方法
這上ie瀏覽器的自我保護機制
2已亥;在所有的瀏覽器下熊赖,禁止用戶批量修改,實例上的公有屬性和方法
但是我們可以通過虑椎,類.prototype.xx進行一個個的修改
一個個修改在標(biāo)準(zhǔn)瀏覽器下震鹉,有兩種方式
1)實例.__proto__.屬性名
2)類.prototype.屬性名
3;
- ?鏈?zhǔn)讲僮骼覀冴P(guān)注的是前一個函數(shù)執(zhí)行完成的返回值传趾,返回的是個數(shù)組,后續(xù)就跟數(shù)組的方法娇未,
- 鏈?zhǔn)綄懛ǎ盒枰WC每一次執(zhí)行方法返回的結(jié)果依然是當(dāng)前類的一個實例墨缘,這樣就可以繼續(xù)調(diào)取原型上的方法了
返回的是個數(shù)字,后續(xù)就跟數(shù)字的方法
num.toFixed(2)保留小數(shù)個數(shù)2位
4;應(yīng)有的條件反射
構(gòu)造函數(shù)镊讼;放的都是私有的屬性和方法
prototype宽涌;放的都是共有的屬性和方法
類.prototype自己賦值一個對象,
constructor一定會出問題
5蝶棋;in判斷某個屬性是否為對象私有+公有屬性 ?加引號
6卸亮;數(shù)組去重;
1.思路1玩裙;雙重循環(huán)
拿當(dāng)前項跟他后面的每一項兼贸,如果相同,刪除其中一個吃溅,一定要預(yù)防數(shù)組塌陷 ;
2;思路2溶诞;創(chuàng)建新數(shù)組
當(dāng)新數(shù)組中沒有重復(fù)的時候,才給新數(shù)組種放
3决侈;思路3螺垢;利用對象不重名的特性
當(dāng)對象中沒有該屬性的時候,賦值為1
當(dāng)對象中已經(jīng)有了該屬性的時候赖歌,進行累加
注意枉圃;兩個條件中,只走一個1)continue 2)if...else...
7;屬性操作
注意庐冯;判斷屬性是否在對象上孽亲,屬性名一定要加引號,否則會把它當(dāng)作變量展父,報錯
1返劲;in判斷某個屬性是否為對象私有+公有屬性 ?加引號
2;obj.hasOwnproperty(屬性名)判斷是否有對象的私有屬性 propertyIsEnumerable也可以用
3犯祠;自己封裝旭等;hasOwnproperty;判斷屬性是否為對象的
8;原型批量設(shè)置
Fn.prototype=
{
手動添加一個:constrouctor:Fn
x:10,
y:11,
c:22
}
call,apply,bind
call:
1:call在Function.prototype原型上找:公有屬性和方法
- f1.call(f2);
函數(shù)中沒有this的時候衡载,
call前面的函數(shù)f1執(zhí)行
- f1.call.call.call.call.call.call.call.call(f2);
-
call(f2) 他先執(zhí)行, ?然后將前面f1.call改成f2.call()執(zhí)行
函數(shù)中沒有this的時候 f2這個函數(shù)執(zhí)行
2:f1.call(obj);
嚴(yán)格和非嚴(yán)格
1: 非嚴(yán)格模式下如果
call的第一個參數(shù)隙袁,不傳或者傳的是undefined/null痰娱,方法種的this是window
2:嚴(yán)格模式下,如果call中第一個參數(shù)不傳就是undefined菩收,其余call中的第一個參數(shù)是啥就是啥梨睁,如果是null就是null,如果傳的的undefined就是undefined 'use strict'
3:call的第一個參數(shù),用來改變call前面這個實例中的this關(guān)鍵字娜饵;
4:call改完this指向坡贺,傳完參數(shù)之后,讓call前面的函數(shù)立即執(zhí)行;
3:call的作用改變this指向
call的第一個參數(shù)遍坟,用來改變call點前面的函數(shù)中this指向
call的第二個參數(shù)開始拳亿,相當(dāng)于給fn的形參從左往右賦值
1)call,apply,bind區(qū)別:
call apply 都是在改完this指向,傳完參數(shù)之后愿伴,讓前面的函數(shù)立即執(zhí)行
區(qū)別肺魁;第二個參數(shù)不同;call從第二個參數(shù)開始隔节,一個個寫參數(shù)鹅经,
apply;第二個參數(shù)是個數(shù)組怎诫;
2)bind;
屬于預(yù)處理機制瘾晃;先把bind前面的函數(shù)種的this改了,參數(shù)傳了幻妓,
然后返回一個修改后的函數(shù)蹦误;在需要的時候,手動調(diào)用 ? 函數(shù)執(zhí)行的時候涌哲,他才執(zhí)行
繼承
子類可以繼承父類的屬性跟方法
1:
call繼承
call:把父類的私有的屬性和方法胖缤,都繼承給了子類私有的
2;冒充繼承
把父類私有+公有的屬性和方法阀圾,都繼承給子類私有的(for var a in f1 )
3;
原型鏈繼承
把父類私有+公有的屬性和方法,都繼承給子類公有的
4;拷貝繼承
call繼承+extend繼承(參數(shù)里面哪廓,后面繼承前面的,)
私有繼承私有的初烘,公有繼承公有的
5:混合繼承:子類私有有父類私有的涡真; 子類公有也有父類私有的
原型鏈繼承:把父類私有+公有,都給了子類公有的
call繼承把父類私有的給了子類私有的肾筐;
6:混合繼承