js 的四种设计模式的优缺点

转自:http://www.cnblogs.com/WebYan/p/6066191.html#commentform

原始模式:

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"

原理:利用构造函数方式创建函数的不同的部分,利用原型方式来定义相同的方法和属性

优点:此种 方式即符合语义又可以扩展新的属性和方法

时间: 2024-11-05 18:50:35

js 的四种设计模式的优缺点的相关文章

下面给出了四种设计模式的作用: 外观(F

下面给出了四种设计模式的作用: 外观(Fa?ade :为子系统中的一组功能调用提供一个一致的接口,这个接口使得这一子系统更加容易使用: 装饰(Decorate):当不能采用生成子类的方法进行扩充时,动态地给一个对象添加一些额外的功能: 单件(Singleton :保证一个类仅有一个实例,并提供一个访问它的全局访问点: 模板方法(Template Method :在方法中定义算法的框架,而将算法中的一些操作步骤延迟到子类中实现. 请根据下面叙述的场景选用适当的设计模式.若某面向对象系统中的某些类有

最常用的四种设计模式

下面列举四种最常用的设计模式 一.Strategy模式 1.两大原则 Strategy 模式体现了如下的两大原则: 1,针对接口编程,而不是针对实现编程. 2,多用组合,少用继承. 2. 例子: 二.Iterator模式  提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示. 这种设计模式非常普遍, 比如Java里面的: public interface Iterator { boolean hasNext(); Object next(); void remove();

Java 判断字符串是否为空的四种方法、优缺点与注意事项

以下是Java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s));方法二: 比较字符串长度, 效率高, 是我知道的最好一个方法: if(s == null || s.length() <= 0);方法三: JavaSE 6.0 才开始提供的方法, 效率和方法二几乎相等, 但出于兼容性考虑, 推荐使用方法二. if(s == null || s.isEmpty()); 方法四:

JS的四种类型识别方式

前言 JS中包含丰富的类型系统,在使用过程中,类型识别是重要的一环.JS提供了4种通用的类型检测的方法 [typeof][instanceof][constructor][Object.prototype.toString] [typeof] [识别] 1.能够识别基本数据类型(Null会被识别成'object') 2.不能识别具体的引用类型(Function除外) console.log(typeof "jerry");//"string" console.log

asp.net后台注册js的四种方法

1. 用Response.Write方法 代码如下: Response.Write("<script type='text/javascript'>alert("keleyi.com");</script>"); 此方法缺陷就是不能调用脚本文件中的自定义的函数,只能调用内部函数,具体调用自定义的函数只能在Response.Write写上函数定 义,比如 Response.Write("<script type='text/ja

二十四种设计模式:迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern) 介绍提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示. 示例有一个Message实体类,某聚合对象内的各个元素均为该实体对象,现在要提供一种方法顺序地访问这个聚合对象中的各个元素. MessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Iterator { /// <summary>

二十四种设计模式:策略模式(Strategy Pattern)

策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里(两种可互换的算法).由客户端决定使用哪种算法. MessageModel using System; using System.Collections.Generic; using System.Text; na

百科知识 液压、气压、机械、与电气四种传动方式优缺点比较

机械传动 一 齿轮传动: 优点: 1 传动比准确.稳定.效率高: 2 工作可靠性高.寿命长: 3 可实现平行轴.任意角相交轴和任意角交错轴之间的传动: ? 缺点: 1 要求较高的制造和安装精度.成本较高: 2 不适宜远距离两轴之间的传动: ? 二 涡轮涡杆传动:优点: 1 传动比大: 2 结构尺寸紧凑: ? 缺点: 1 轴向力大.易发热.效率低.: 2 只能单向传动: ? ? 三 带传动: 优点: 1 适用于两轴中心距较大的传动: 2 带具有良好的挠性,可缓和冲击,吸收振动: 3 过载时打滑防止

二十四种设计模式:解释器模式(Interpreter Pattern)

解释器模式(Interpreter Pattern) 介绍给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子. 示例有一个Message实体类,某个类对它的操作有Get()方法.现在要求用具有某一规则的中文语法来执行这个操作. MessageModel using System; using System.Collections.Generic; using System.Text; namespace Pattern.Interpreter { //