1. 對象由兩部分構成:屬性 和 方法;
2. 面向對象和麪向過程的區別
面向對象,主要會使用已經封好的方法;
面向過程,需要考慮整個封裝的細節;
3. 面向對象的特點:封裝、繼承、多態
1)封裝:對於一樣的功能,我們只需要封裝一次,以後再使用,直接調用即可:複用;
專業術語:低耦合,高內聚;
2)繼承:子類繼承父類中的屬性和方法;
3)多態:包含重載和重寫:
重載:JS中不存在嚴格意義上的重載;但有類似重載的功能,就是給同一個方法,傳不同的參數,可以實現不同的功能;
重寫:子類可以重寫父類的屬性和方法
4. 模塊化開發
對於一個大型項目,公司會分配給不同的工程師去同步開發,等大家開發完成,把各自完成的模塊合併到一起,這個項目就完成;
單例模式,就是最簡單,最常用的模塊化開發;
5. 單例模式
就是把描述同一事物的屬性和方法,放在同一個命名空間下;這樣就避免了變量名衝突的問題;
單例模式的本質:普通對象;
命名空間:瀏覽器會爲對象開闢一個空間(堆內存),我們給這個空間起個名字,比如例1中的person1就是命名空間;
例1:
var name='aa';
var age=8;
var person1={
name:'bb',
age:18,
do:function(){
console.log('eat')
}
};
var person2={
name:'cc',
age:16,
do:function(){
console.log('sing')
}
};
6.單例模式的優缺點總結:
優點:
1.避免全局變量名衝突的問題
2.可以進行模塊化開發:
1)模塊之間的相互調用:模塊名.屬性名
2)本模塊內個方法的相互調用:this.屬性名/方法名;
缺點:當對象的屬性名和屬性值相同的時候,會造成大量冗餘代碼;
解決措施:爲了避免相同的功能,返回的重寫;我們可以進行相同功能代碼的封裝--工廠模式;
7. 工廠模式3步驟:
1)引進原材料 var obj={};
2)加工原材料 obj.xxx=xxx;
3)輸出成品 return obj;
工廠模式的本質:封裝;
例2
function person(name,age,fn){
var obj={};
obj.name=name; //給對象添加了屬性
obj.age=age;
obj.showName=function(){//給對象添加了方法;
alert(‘我的名字是’+this.name);
}
return obj;
}
var p1=person(‘bb’,16);
var p2=person(‘cc’,8);
8. 構造函數模式
創建自定義的類,並且,該自定義的類能夠new出實例;
prototype原型上都存的是公有的屬性和方法;
例3:
function Person(name,age,fn){//構造函數中放的都是私有的屬性和方法;
//var obj={};系統自動幫我們創建對象;
//構造函數中的this:指向當前new出來的這個實例;
this.name=name; //給對象添加了屬性
this.age=age;
/*this.showName=function(){//給對象添加了方法;
alert('我的名字是'+this.name);
};*/
}
//把構造函數中對象的方法,放在了prototype原型上:原型就是用來保存公有的屬性和方法;
Person.prototype.showName=function(){
alert('我的名字是'+this.name);
};
var p1=new Person('bb',16);
var p2=new Person('cc',8);
p1.showName();
p2.showName();
9. 工廠模式和構造函數模式的區別:
1. 在調用階段:
1.工廠模式調用時首字母小寫;但是構造函數模式,首字母大寫
2.構造函數調用時有new;而工廠模式沒有new;
注意:
1)構造函數new出來的都是實例;實例都是對象數據類型;
2)構造函數都是類,類都是函數數據類型;
2. 在定義階段:
工廠模式定義階段有3步驟:1)自己創建對象 2)加工對象 3)自己返回對象;
構造函數模式定義階段只有1個步驟:加工對象; 因爲系統會自動幫我們創建對象和返回已經加工好的對象;
10. 關於構造函數的總結:
1)構造函數中存的都是私有的屬性和方法
2)構造函數中的this指向當前new出來的實例;
3)構造函數中不需要手動返回對象,如果自己寫了返回值:
1:返回基本數據類型,我們的實例仍然具有給他綁定屬性和方法,不會發生任何影響;
2:返回引用數據類型,會覆蓋掉系統返回的對象;那我們創建的實例,就不具有他的屬性和方法了;
4)構造函數主要是類和實例打交道;
5)在創建實例的時候,如果沒有參數,小括號可以省略;
6)構造函數中,實例只跟this.xxx有關,跟變量沒有任何關係;
11. 原型模式
- 原型模式基礎知識:
- 1)每個函數數據類型(構造函數,普通函數)上,都天生自帶一個屬性,叫做prototype,prototype是一個對象;
2)prototype這個對象上,天生自帶一個屬性,叫做constructor,他指向當前這個類;
3)每個對象數據類型(實例,prototype,普通對象),都自帶一個屬性叫做proto,他指向當前實例所屬類的原型; - Object.prototype上的一些公有方法:
- hasOwnProperty():判斷屬性是否爲對象的私有屬性 返回值:boolean;
obj1.isPrototypeOf(obj2):判斷obj1是否在obj2的原型鏈上;
propertyIsEnumerable():判斷是否爲可枚舉的屬性
toString() - 原型鏈:如何查找obj.屬性名
- 1)先在自己的私有空間中進行查找,如果找到,說明這個屬性是對象私有屬性;
2)如果找不到,通過proto,去它所屬類的原型上找,找到的話,屬於公有屬性;
3)如果找不到,繼續通過proto一層層往上找,一直找到Object.prototype還沒有的話是undefined;
注意:如果找的是方法的話,最終找不到,會報錯; - 易混淆概念區分
- 1)一提到構造函數:1:構造函數中都是私有的屬性和方法 2:構造函數就是 實例和類打交道
2)一提到構造函數原型模式:1.原型上放的都是公有的屬性和方法 2.原型模式是: 實例,類,原型三個打交道;
3)一提到 proto,就是指原型鏈;對象找他的屬性和方法都是通過proto一級級查找的;
4)一旦我們更改了類.prototype的指向,直接給他賦值一個我們自己定義的對象,那麼他的constructor就是指向了Object這個類;
所以,只要見到 Fn.prototype={};一定要注意他的constructor