javascript面向对象的几种设计模式详解
日期:2018-03-21
来源:程序思维浏览:1697次
javascript面向对象的设计模式有:工厂模式、构造函数模式、原型模式、混合的构造函数和原型模式,你们知道吗?还有一个神秘的第五种设计模式哦!
下面让程序思维和大家分享一下吧:
第一种:工厂模式
代码:
function createCar() {
var oTempCar = new Object;
oTempCar.name = ”法拉利";
oTempCar.color = “blue”;
oTempCar.showColor = function() {
alert(this.color);
};
return oTempCar;
}
var oCar1 = createCar();
var oCar2 = createCar();
工厂模式优点与缺点:
优点:解决了创建多个相似对象的问题可以实现重用性。
缺点:没有解决对象识别的问题 ,不知道我实例化了哪个对象,不像个对象,难以理解。
应用场景: 适用于只创建于一个类型的对象。
第二种:构造函数模式
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);
构造函数方式的优缺点:
优点:解决了对象识别的问题,思路比较清晰。
缺点:构造函数虽然好用,但并非没有缺点。使用构造函数的主要问题,就是每个方法都要在每个实例上重新创建一遍,这样比较费性能。
应用场景:由于写法简单,思路清晰适合创建单应用对象实例。
第三种:原型模式
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方式添加属性和方法,让继承和重用更加清晰。
缺点:不能通过给构造函数传递参数来初始化属性的值,而且如果其中某个实例属性重新赋值,会导致其他的实例同一属性也会发生变化。
应用场景:适用于不同类型的对象。
第四种:混合的构造函数/原型方式
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"
混合的构造函数/原型方式优缺点:
优点:此种方式即符合语义又可以扩展新的属性和方法。
缺点:代码封装性不是很好。
应用场景:逻辑比较复杂的程序。
第五种:混合的JSON/构造函数/原型方式
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);
},
showName:function(){
alert(this.doors);
}
}
var oCar1 = new Car("red",4,23);
alert(oCar1.drivers); //输出 "Mike,John,Bill"
混合的JSON/构造函数/原型方试的优缺点:
优点:此种方式即符合语义又可以扩展新的属性和方法,代码封装性好,易读简洁。
缺点:暂没发现。
应用场景:逻辑比较复杂的程序。
下面让程序思维和大家分享一下吧:
第一种:工厂模式
代码:
function createCar() {
var oTempCar = new Object;
oTempCar.name = ”法拉利";
oTempCar.color = “blue”;
oTempCar.showColor = function() {
alert(this.color);
};
return oTempCar;
}
var oCar1 = createCar();
var oCar2 = createCar();
工厂模式优点与缺点:
优点:解决了创建多个相似对象的问题可以实现重用性。
缺点:没有解决对象识别的问题 ,不知道我实例化了哪个对象,不像个对象,难以理解。
应用场景: 适用于只创建于一个类型的对象。
第二种:构造函数模式
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);
构造函数方式的优缺点:
优点:解决了对象识别的问题,思路比较清晰。
缺点:构造函数虽然好用,但并非没有缺点。使用构造函数的主要问题,就是每个方法都要在每个实例上重新创建一遍,这样比较费性能。
应用场景:由于写法简单,思路清晰适合创建单应用对象实例。
第三种:原型模式
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方式添加属性和方法,让继承和重用更加清晰。
缺点:不能通过给构造函数传递参数来初始化属性的值,而且如果其中某个实例属性重新赋值,会导致其他的实例同一属性也会发生变化。
应用场景:适用于不同类型的对象。
第四种:混合的构造函数/原型方式
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"
混合的构造函数/原型方式优缺点:
优点:此种方式即符合语义又可以扩展新的属性和方法。
缺点:代码封装性不是很好。
应用场景:逻辑比较复杂的程序。
第五种:混合的JSON/构造函数/原型方式
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);
},
showName:function(){
alert(this.doors);
}
}
var oCar1 = new Car("red",4,23);
alert(oCar1.drivers); //输出 "Mike,John,Bill"
混合的JSON/构造函数/原型方试的优缺点:
优点:此种方式即符合语义又可以扩展新的属性和方法,代码封装性好,易读简洁。
缺点:暂没发现。
应用场景:逻辑比较复杂的程序。
精品好课