關於JS的面向對象總結
什麽是面向對象:
對象由兩部分構成:屬性 和 方法;
面向對象的特點:
-
1.封裝:對於相同功能的代碼,放在一個函數中,以後再用到此功能,只需要調用即可,無需再重寫;避免大量冗余代碼;
專業話說:低耦合,高內聚;
-
2.繼承:子類繼承父類原有的屬性和方法;
類:‘Object‘,‘Function‘,‘Number‘,‘String‘,‘Array‘,‘RegExp‘,‘Date‘.....
-
3.多態:重載和重寫;
重載:在JS中不存在嚴格意義上的重載;但是,JS中有類似重載的功能:同一個函數,傳不同的參數,實現不同的功能;
重寫:子類可以重寫父類的屬性和方法;
-
4.會學到的設計模式:單例模式,工廠模式,構造函數模式,原型模式;
-
5.單例模式:把描述同一事物的屬性和方法,放在同一個命名空間下,避免了變量名沖突的問題
命名空間:瀏覽器開辟了一個堆內存,給他分配的名字person1就是命名空間
單例模式本質:普通對象;
-
6.模塊化開發:對於一個大型項目,項目組會分配給不同的工程師去開發(這些開發是同步進行的);等所 有人開發完成,合在一起,整個項目就完成了;
- 1)單例就是簡單的模塊化開發;
- 2)可以實現本模塊間的相互調用:this.屬性名;
- 3)可以實現模塊之間的相互調用:模塊名.屬性名;
-
7.單例模式的優缺點:
- 優點:
- 1)可以實現模塊化開發
- 2)避免了屬性名相同,以及變量名相同的沖突問題;
- 缺點:傳統的手工作業模式,開發效率低,並且造成大量冗余代碼;
解決措施:封裝--工廠模式
- 優點:
-
8.工廠模式的思想:
- 1.引進一批原材料----1.var obj={}; var obj=new Object();我們自己創建一個空對象
- 2.對原材料進行加工---2.給空對象添加一些私有的屬性和方法;
- 3.輸出原材料---3.輸出對象 return obj;
工廠模式的本質:封裝;
-
9.構造函數模式:--為了自定義一個類,並且可以創建一些實例;
實例 instanceOf 類;==》返回的是 boolean值;
構函數模式跟工廠模式的區別:
-
1.在調用時候
- 構造函數 new Person();
- 工廠模式 person();
-
2.在函數體內的區別;
- 構造函數:系統自動創建一個對象,等我們給對象加工完成後,系統自動輸出該對象;
- 工廠模式:手動創建對象,等我們給對象加工完成後,手動輸出對象;
缺點:對於相同的功能,卻不相等;
解決措施:prototype原型,把功能相同的代碼,放在一個公共區間;
-
-
10.關於構造函數:
- 1.構造函數中放的都是私有的屬性和方法;
- 2.就是實例和類在打交道;
- 3.在創建一個實例的時候,如果不需要傳參,小括號可以省略;
- 4.構造函數this,永遠指向當前實例;
- 5.在構造函數中,實例只跟this.xxx有關系,跟變量沒有任何關系;
- 6.構造函數中,系統默認會為我們返回一個對象;如果我們手動返回的話:
- 1)return 基本數據類型,不會造成任何影響;實例還有他的屬性和方法;
- 2)return 引用數據類型,會影響系統返回的對象,實例就沒有他以前的屬性和方法了; 所,不建議手動返回對象;
-
11.原型模式:原型 prototype
- 1 當我們聲明了一個函數(構造函數,類)的時候,天生自帶了一個prototype的屬性
- 1 並且這prototype的值也是一個對象類型的
- 2這個對象類型值也有一個天生自帶的屬性叫constructor並且這個性的值是函數(構造函數,類)本身
- 2 這個類的實例也會有一個叫做__proto__的天生自帶的屬性,並且這個屬性的值也是一個對象類型的這個值是這個實例所屬類的原型.
- 3 每一個引用類型都有一個天生自帶的屬性叫__proto__,所以說我們的prototype的值也有天生自一個__proto__的屬性。並且這個屬性的值也是一個對象類型,一直到我們的基類Object
- 4 通過類的原型添加的屬性和方法都是公有的,每個實例都會自帶
- 5 一個實例的方法在運行的時候,如果這個方法是自己私有的,那麽就直接用,如果不是私有的,那通過__proto__去所屬類的原型上去查找,如果還沒有就通過原型的 __proto__一直查到基類的Object.果還沒有報錯,如果有就直接用了。我們把這種通過__proto__查找的機制叫做原型鏈.
- 1 當我們聲明了一個函數(構造函數,類)的時候,天生自帶了一個prototype的屬性
-
12.原型模式的基礎知識:重中之重
- 1)每一個函數數據類型(類,普通函數)上都天生自帶一個屬性,叫做prototype(原型),它是一個對象;
- 2)prototype這個原型上,天生自帶一個屬性,叫做constructor,指向當前所屬的類; constructor:類;
- 3)每個對象(實例,普通對象,prototype)上,都天生自帶一個屬性,叫做__proto__,他指向當前實例所屬的類的原型;
-
13.Object.prototype:都放的公有的屬性和方法
- hasOwnProperty:判斷attr這屬性是否是這個對象上的私有屬性;
- isPrototypeOf:obj1是否在obj2的原型鏈上;
- propertyIsEnumerable:是否可枚舉的屬性;
-
14
- 每個類都是函數數據類型;
- Object是對象數據類型的基類;
-
15
- 構造函數模式:實例 和 類;
- 原型模式:實例 , 類, 原型;
- 構造函數裏:私有的屬性和方法;
- prototype上:公有的屬性和方法;
-
16.原型鏈查找機制:比如要查找f1.x==>對象.屬性名
- 1)在自己的私有屬性上查找,如果找到那麽這個屬性就是私有屬性;
- 2)如果沒找到,通過__proto__去所屬類的原型上進行查找,因為原型上放的都是公有的屬性和方法,所以,如果找到,這個屬性就是公有的;
- 3)如果沒找到,通過__proto__一層層往找,最終找到基類Object.prototye上,如果還沒有,undefined!
-
17.重寫:子類通過__proto__一級級往上去修改父類的屬性和方法;這就是子類對父類的重寫; 既然子類可以重寫父類,系統為了防止子類通過__proto__去更改系統內置的屬性和方法,所以在IE瀏覽器下,禁止我們使用__proto__;
- 18.繼承:子類可以繼承父類原有的屬性和方法,但是當子類添加私有屬性和方法的時候,不對父類造成影響;
- 1)原型鏈繼承:把父類的私有+公有的屬性和方法,都作為子類公有的屬性; 核心:不是把父類私有+公有的屬性克隆一份一模一樣的給子類的公有吧;他是通過__proto__建立和子類之間的原型鏈,當子類的實例需要使用父類的屬性和方法的時候,可以通過__proto__一級級找上去使用;
- 2)call繼承:把父類私有的屬性和方法給了子類私有的屬性和方法; 核心思想:相當於把父類私有的屬性和方法克隆了一份一模一樣的給子類的私有屬性;
- 3)冒充對象繼承:把父類公有的+私有的屬性都作為了子類私有的屬性;
- 4)混合繼承1:call繼承+原型鏈繼承 call繼承:把父類私有的作為自己私有的; 原型鏈繼承:把父類私有+公有做為公有的; 問題:父類私有的,在子類私有+公有兩個地方都存在;
- 5)混合繼承2:call繼承+拷貝繼承 call繼承:把父類私有的作為自己私有的; 拷貝繼承:通過for in循環,把父類公有的屬性和方法克隆了一份一模一樣的給子類公有的;
- 6)寄生式組合繼承: call繼承:把父類私有的作為自己私有的;
-
Object.create()思想:
- 1)創建一個空類;
- 2)給空類的原型上添加了父類原型的地址;(相當於把父類原型上的公有屬性和方法,給了空類原型上)
- 3)子類的原型上添加空類的實例;(這樣,子類就可以通過__proto__去找父類公有的屬性和方法;但是不受父類私有屬性的影響)
關於JS的面向對象總結