js 的四種設計模式的優缺點


原始模式:

1     var Car = new Object;
2 
3     Car.color = "blue";
4     Car.door = 4;
5     Car.showColor = function() {
6         alert(this.color);
7     }
8 
9     Car.showColor(); //"blue";

原理:聲明對象,后續給對象加屬性和方法

優點:可以直觀的看出對象Car有屬性 color,door,方法showcolor;

缺點:如果有多個類型,需要創建多個實例;

 

工廠模式:

 1     function createCar() {
 2         var Car = new Object;
 3 
 4         Car.color = "blue";
 5         Car.door = 4;
 6         Car.showColor = function() {
 7             alert(this.color);
 8         }
 9 
10         return Car;
11 
12     }
13 
14     var car1 = createCar();
15     var car2 = createCar();
car1.showColor() //blue;
car2.showColor() //blue;

原理:將原始方式封裝到函數中,並返回這個對象

優點:同一類型同一屬性可以重復調用;

缺點:同一類型不同屬性值的不能調用;

 

工廠模式為函數傳參

    function showColor() {
        alert(this.color);
    }

    function createCar(sColor, sDoor) {
        var Car = new Object;

        Car.color = sColor;
        Car.door = sDoor;
        Car.showColor = showColor;
        return Car;

    }

    var car1 = createCar("red","4");
    var car2 = createCar("blue","6");
    car1.showColor();
    car2.showColor();

原理:工廠模式的升級版,為函數添加參數,方法調取外部的函數的指針

優點:解決了重復創建函數的問題;

缺點:不符合語義,看起來不像是對象的方法,理解難道大

 

構造函數方式

function Car(sColor,iDoors,iMpg) {
  this.color = sColor;
  this.doors = iDoors;
  this.mpg = iMpg;
  this.showColor = function() {
    alert(this.color);
  };
}

var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);

原理:在構造函數內使用 this 關鍵字,創建屬性和方法。再使用 new 運算符創建實例,通過傳參生成不同的實例。

優點:該方式解決了以上模式所遇到的問題

缺點:構造函數會重復生成函數,為每個對象都創建獨立的函數版本

 

原型方式

function Car() {
}

Car.prototype.color = "blue";
Car.prototype.doors = 4;
Car.prototype.mpg = 25;
Car.prototype.showColor = function() {
  alert(this.color);
};

var oCar1 = new Car();
var oCar2 = new Car();

原理:創建一個構造函數,再函數外為通過prototype方式添加屬性和方法,最后通過new 運算符生成實例

優點:語義上,看起來所有屬性都是同一個對象,解決了上兩種方式所遇到的問題;

缺點:不能通過給構造函數傳遞參數來初始化屬性的值,而且如果其中某個實例屬性重新賦值,會導致其他的實例同一屬性也會發生變化

function Car() {
}

Car.prototype.color = "blue";
Car.prototype.doors = 4;
Car.prototype.mpg = 25;

//指向一個對象
Car.prototype.drivers
= new Array("Mike","John");
Car.prototype.showColor
= function() { alert(this.color); }; var oCar1 = new Car(); var oCar2 = new Car();
//為oCar1新加入 oCar1.drivers.push(
"Bill"); alert(oCar1.drivers); //輸出 "Mike,John,Bill" alert(oCar2.drivers); //輸出 "Mike,John,Bill"

上面的代碼中,屬性 drivers 是指向 Array 對象的指針,該數組中包含兩個名字 "Mike" 和 "John"。由於 drivers 是引用值,Car 的兩個實例都指向同一個數組。這意味着給 oCar1.drivers 添加值 "Bill",在 oCar2.drivers 中也能看到。輸出這兩個指針中的任何一個,結果都是顯示字符串 "Mike,John,Bill"。

 

 

混合的構造函數/原型方式

function Car(sColor,iDoors,iMpg) {
  this.color = sColor;
  this.doors = iDoors;
  this.mpg = iMpg;
  this.drivers = new Array("Mike","John");
}

Car.prototype.showColor = function() {
  alert(this.color);
};

var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);

oCar1.drivers.push("Bill");

alert(oCar1.drivers);    //輸出 "Mike,John,Bill"
alert(oCar2.drivers);    //輸出 "Mike,John"

原理:利用構造函數方式創建函數的不同的部分,利用原型方式來定義相同的方法和屬性

優點:此種 方式即符合語義又可以擴展新的屬性和方法



結語:此篇只是作為理解設計模式所寫,如有錯誤,請各位同仁指出,共同學習

參照鏈接 http://www.w3school.com.cn/js/pro_js_object_defining.asp

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM