JavaScript基礎(十) -- 設計模式

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章