JavaScript设计模式之工厂模式和构造器模式

什么是模式

前阵子准备期末考试,劳神又伤身的,实在闲不得空来更新文章,今天和大家说说javascript中的设计模式。

首先呢,我们需要知道的是:模式是一种可复用的解决方案,而反模式呢就是针对某个问题的不良解决方案。

js反模式常见例子

1.向setTimeout和setInterval传递字符串,而不是函数,这会触发eval()的内部使用。
2.在全局上下文中定义大量的变量污染全局命名空间
3.修改Object类的原型
4.以内联形式使用js,嵌入在HTML文件中的js代码是无法包含在外部单元测试工具中的。
5.滥用document.write,如果在页面加载完成后执行docume.write,它会重写我们所在的页面,可以使用document.creatElement代替的话就尽量不用docume.write。

设计模式的类别

创建型设计模式

创建型设计模式专注于处理对象创建机制,以适合给定情况的方式来创建对象。属于这个类别的属性包括:

Constructor构造器、Factory工厂、Abstract抽象、Prototype原型、Singleton单例和Builder生成器

结构型设计模式

结构型模式与对象组合有关,通常可以用于找出在不同对象之间建立关系的简单方法。
属于这个类别的模式包括:

Decorator装饰者、Facade外观、Flyweight享元、Adapter适配器和Proxy代理

行为设计模式

行为模式专注于改善或简化系统中不同对象之间的通信。

行为模式包括:

Iterator迭代器、Mediator中介者、Observer观察者和Visitor访问者

Factory(工厂)模式

为了解决多个类似对象声明的问题,我们可以使用一种叫做 工厂模式的方法,这种方法 就是为了解决实例化对象产生大量重复的问题。

复制代码 代码如下:

<script type="text/javascript">
    function createObject(name,age,profession){//集中实例化的函数
        var obj = new Object();
        obj.name = name;
        obj.age = age;
        obj.profession = profession;
        obj.move = function () {
            return this.name + ' at ' + this.age + ' engaged in ' + this.profession;
        };
        return obj;
    }
    var test1 = createObject('trigkit4',22,'programmer');//第一个实例
    var test2 = createObject('mike',25,'engineer');//第二个实例
    alert(test1.move());
    alert(test2.move());
</script>

工厂模式的分类

工厂模式分为简单工厂、抽象工厂和智能工厂,工厂模式不显示地要求使用一个构造函数。

简单工厂模式:使用一个类(通常为单体)来生成实例。
复杂工厂模式:使用子类来决定一个成员变量应该是哪个具体的类的实例。

工厂模式之利

主要好处就是可以消除对象间的耦合,通过使用工程方法而不是new关键字。将所有实例化的代码集中在一个位置防止代码重复。
工厂模式之弊

大多数类最好使用new关键字和构造函数,可以让代码更加简单易读。而不必去查看工厂方法来知道。   
工厂模式解决了重复实例化的问题 ,但还有一个问题,那就是识别问题,因为根本无法 搞清楚他们到底是哪个对象的实例。

复制代码 代码如下:

alert(typeof test1); //Object
alert(test1 instanceof Object); //true

何时使用工厂模式?

Factory模式主要在以下场景使用:

1.当对象或组件涉及高复杂性时
2.当需要根据所在的不同环境轻松生成对象的不同实例时
3.当处理很多共享相同属性的小型对象或组件时

Constructor(构造器)模式

ECMAScript 中可以采用构造函数(构造方法)可用来创建特定的对象。 该模式正好可以解决以上的工厂模式无法识别对象实例的问题。

复制代码 代码如下:

<script type="text/javascript">
    function Car(model,year,miles){//构造函数模式
        this.model = model;
        this.year = year;
        this.miles = miles;
        this.run = function () {
            return this.model + " has done " + this.miles + "miles";
        }
    }
    var Benz = new Car('Benz',2014,20000);
    var BMW = new Car("BMW",2013,12000);
    alert(Benz instanceof Car); //很清晰的识别他从属于 Car,true

    console.log(Benz.run());
    console.log(BMW.run());
</script>

使用构造函数的方法 ,即解决了重复实例化的问题 ,又解决了对象识别的问题,该模式与工厂模式的不同之处在于:

1.构造函数方法没有显示的创建对象 (new Object());
2.直接将属性和方法赋值给 this 对象;
3.没有 renturn 语句。

构造函数的方法有一些规范:

1.函数名和实例化构造名相同且大写, (PS:非强制,但这么写有助于区分构造函数和 普通函数);
2.通过构造函数创建对象,必须使用 new 运算符。 
既然通过构造函数可以创建对象,那么这个对象是哪里来的, new Object()在什么地方执行了?执行的过程如下:

1.当使用了构造函数,并且 new 构造函数(),那么就后台执行了 new Object();
2.将构造函数的作用域给新对象 ,(即 new Object()创建出的对象),而函数体内的 this 就 代表 new Object()出来的对象。
3.执行构造函数内的代码;
4.返回新对象(后台直接返回)。

带原型的Constructor(构造器)

js中有一个名为prototype的属性。调用js构造器创建一个对象后,新对象就会具有构造器原型的所有属性。通过这种方式,可以创建多个Car对象,并访问相同的原型。

复制代码 代码如下:

   <script type="text/javascript">
        function Car(model,year,miles) {
            this.model = model;
            this.year = year;
            this.miles = miles;
        }
        Car.prototype.run = function () {
            return this.model + " has done " + this.miles + " miles ";

        };
        var Benz = new Car('S350',2010,20000);
        var Ford = new Car('Ford',2012,12000);

        console.log(Benz.run());//"S350 has done 20000 miles "
        console.log(Ford.run());
    </script>


现在run()的单一实例就能够在所有Car对象之间共享。

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
一般事件 事件 浏览器支持 描述 onClick IE3|N2|O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDblClick IE4|N4|O 鼠标双击事件 onMouseDown IE4|N4|O 鼠标上的按钮被按下了 onMouseUp IE4|N4|O 鼠标按下后,松开时激发的事件 onMouseOver IE3|N2|O3 当鼠标移动到某对象范围的上方时触发的事件 onMouseMove IE4|N4|O 鼠标移动时触发的事件 onMouseOut IE4|N3|O3 当鼠标离开某
复制代码 代码如下: !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" HTML xmlns="http://www.w3.org/1999/xhtml" HEAD TITLE分别用marquee和div+js实现首尾相连循环滚动效果/TITLE /HEAD BODY 用marquee实现首尾相连循环滚动效果(仅IE)
本文实例讲述了js实现同一个页面多个渐变效果的方法。分享给大家供大家参考。具体分析如下: 这里可实现5个元素中随便一个,鼠标移上去透明度渐渐增加,鼠标移出,透明度渐渐减小的效果。 要点一: var speed = 0;if(targetobj.alpha){speed = 5;}else{speed = -5;} 根据目标值和当时值的对比,来决定是正向还是负向速度。 要点二: for(i=0; iruns_li.length; i++){runs_li[i].timer = null;runs_li[i]
有一道js面试题,题目是这样的:下列代码的执行结果是什么,为什么? 复制代码 代码如下: var i, j, k; for (i=0, j=0; i10, j6; i++, j++) { k = i+j; } document.write(k); 答案是显示10,这道题主要考察JavaScript的逗号运算符。 下面是 MDN 对逗号运算符的定义: 逗号运算符计算两个操作数(从左至右)并返回第二个操作数的值。 根据这个定义,可以扩展一下: 逗号运算符从左到右计算两个或多个操作数并返回最后一个操作数的值。

jquery处理json数据实例分析 - 2015-04-25 20:04:14

一、JSON的一些基础知识。 JSON中对象通过“{}”来标识,一个“{}”代表一个对象,如{“AreaId”:”123”},对象的值是键值对的形式(key:value)。 “[]”,标识数组,数组内部各个数据之间通过“,”分割,如[“AreaId”:”123”,”AreaId”:”345”]。 很多情况下是对象数组,那就是这样: 复制代码 代码如下: [{“AreaId”:”123”},{“AreaId”:”345”}] 其实数组也是一个对象,上面的格式也可以写成这样: 复制代码 代码如下: {“Are
复制代码 代码如下: $("#picTxt").attr("value",picTxt);
用jQuery实现的模仿a的title属性的例子,在测试的时候ie6,7上出现了层次混乱,不过最终解决了。 html代码如下 : 复制代码 代码如下: div class="wrap" ul class="list clearfix" lia href=#>div class="show" p所属部门:技术部/p p工作地点:郑州/p p招聘人数:21/p /div /li lia href=#>div class="show" p所属部门:技术部/p p工作地点:郑州/p p招聘人数:21/p /div
打造 漂亮 动态 友好的 精选随机色彩 投票百分比展示 效果 HTML结构: 复制代码 代码如下: ul class="vote-box-list clearfix" id="appVoteBox" li class="vl-item" id="voteItem0" div class="vote-item-wrap" h4A:/h4 p class="litem"em class=vleft/emspan/spanem class=vright/em /pspan class=vnum79(2%)/spa

php常见的页面跳转方法汇总 - 2015-04-25 20:04:14

在php编写中有时会用户页面跳转,在这里收集了几种不错的跳转方法,可以用到。 用HTTP头信息实现 也就是用PHP的HEADER函数。PHP里的HEADER函数的作用就是向浏览器发出由HTTP协议规定的本来应该通过WEB服务器的控制指令,例如声明返回信息的类型("Context-type: xxx/xxx"),页面的属性("No cache", "Expire")等等。 用HTTP头信息重定向到另外一个页面的方法如下: 复制代码 代码如下: ? if (isset($url)) { Header("HTT
先看一段简单的代码: 复制代码 代码如下: var testFun=function (name,age){ var job='Flash Develop'; return new testFun.init(name,age,job); } testFun.init=function(name,age,job){ return 'name:'+name+',age:'+age+',job:'+job+''; } alert(testFun('vincent',30)); //[object Object]