前端设计模式:从js原始模式开始,去理解Js工厂模式和构造函数模式

时间: 2018-01-18阅读: 843标签: 模式

原始模式:  

在js中我们需要创建一个对象,比如创建一个“人”,它拥有自己的名称属性,和可以说话的功能,我们可以这样实现:

var person = new Object;
person.name = "Tony";
person.sayName = function(){
	console.log(this.name);
};
//或者字面量形式
var person={
	name:"tony",
	sayName:function(){
		console.log(this.name);
	}
}

这种设计被称为:原始模式。我们可以看出它具如下优缺点:

优点:可以直观的看出对象拥有的属性和方法
缺点:如果有多个类型,需要创建多个实例


工厂模式  

如果需要批量创建多个人,如person1、person2……的时候,使用原始模式的话每次都要重复类似的代码,如果要是可以批量生产就好了,这个时候使用工厂模式就能很好解决。如下:

var person=function(name){
	var obj=new Object;
	obj.name=name;
	obj.sayName=function(){
		console.log(this.name);
	}
	return obj
}
var p1=person('tony');
var p2=person('aimi');
console.log(typeof p1);  // object
console.log(typeof p2);  // object
console.log(p1 instanceof Object); // true

这样简单的调用就可进入造人模式了(啪啪啪……),只需要指定姓名就可以了。所以工厂模式可以理解像生活中工厂一样,可以批量的生产具有相同属性和功能的商品。开发场景:当我们需要解决很多相似问题,这时候就需要采用工厂模式来实现。

但是工厂模式下的对象我们不能识别它的类型,由于typeof返回的都是object类型,不知道它是那个对象的实例。另外每次造人时都要创建一个独立的person的对象,会造成代码臃肿的情况。所以工厂模式的优缺点总结如下:

优点:同一类型同一属性可以重复调用;能解决多个相似的问题。 
缺点:不能知道对象识别的问题(对象的类型不知道)。


构造函数模式

除了上面讲的工厂模式外,我们还可以使用构造函数模式来解决重复造轮子,产生大量的重复性代码的问题。例如:

var Person=function(name){
	this.name=name;
	this.sayName=function(){
		console.log(this.name);
	}
}
var p1=new Person('tony');
var p2=new Person('aimi');

我们可以看出要使用Person的新实例,就必须使用new。新实例的constructor(构造函数)属性指向的就是Person。

console.log(p1.constructor == Person);//true

同时使用instanceof检测对象的类型就更为可靠了,因为instanceof是用来专门比较一个对象是否为某个构造函数的实例:

console.log(p1 instanceof Object); // true
console.log(p1 instanceof Person); // true

这就是构造函数比工厂模式强的地方,因为它只道自己从哪里来,通过谁产生的。



利用工厂方法对构造函数模式代码的改进: 

当创建对象的流程赋值的时候,比如依赖于很多设置文件等。并且,你会经常在程序里看到工厂方法,用于让子类类定义需要创建的对象类型。  

var Person = (function () {
    var Person = function (name) {
        this.name = name;
        this.sayName=function(){
		console.log(this.name);
	}
    };
    return function (name) {
        return new Person(name);
    };
})();

var p1 = new Person("tony");


 

 

吐血推荐

1.站长广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入...

2.休闲娱乐: 直播/交友    优惠券领取   网页游戏   H5游戏

链接: http://www.fly63.com/article/detial/369

JS 中的装饰器模式

使用过 mobx + mobx-react 的同学对于 ES 的新特性装饰器肯定不陌生。我在第一次使用装饰器的时候,我就对它爱不释手,书写起来简单优雅,太适合我这种爱装 X 且懒的同学了。

前端JavaScript设计模式

面向对象的三大特性:继承、封装、多态。JavaScript 没有提供传统面向对象语言中的类式继承,而是通过原型委托的方式来实现对象与对象之间的继承。JavaScript 也没有在语言层面提供对抽象类和接口的支持。

TypeScript设计模式之享元模式

享元模式就是运行共享技术有效地支持大量细粒度的对象,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类,在享元模式中有两个重要的概念,即内部状态和外部状态:

Js实现基于类的枚举模式

枚举是由一组值组成的类型。例如 TypeScript 中有内置的枚举,我们可以通过它们来定义自己的布尔类型:这段 TypeScript 代码会被编译为以下 JavaScript 代码

TypeScript 设计模式之观察者模式

观察者模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。

TypeScript 设计模式之单例模式

单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池、全局缓存、浏览器中的 window 对象等。单例模式用于保证一个类仅有一个实例,并提供一个访问它的全局访问点。

TypeScript 设计模式之适配器模式

在实际生活中,也存在适配器的使用场景,比如:港式插头转换器、电源适配器和 USB 转接口。 而在软件工程中,适配器模式的作用是解决两个软件实体间的接口不兼容的问题

从一道面试题简单谈谈发布订阅和观察者模式

今天的话题是javascript中常被提及的「发布订阅模式和观察者模式」,提到这,我不由得想起了一次面试。记得在去年的一次求职面试过程中,面试官问我,你在项目中是怎么处理非父子组件之间的通信的?。

js设计模式:观察者和发布订阅模式

总是把这两个当作同一个模式,但其实是不太一样的,现在重温一下。观察者直接订阅目标,当目标触发事件时,通知观察者进行更新;发布订阅模式通过一个调度中心进行处理,使得订阅者和发布者分离开来

Typescript 严格模式有多严格?

use strict指令在 JavaScript 1.8.5 (ECMAScript5) 中新增。至今,前端 er 们基本都默认开启严格模式敲代码。那么,你知道 Typescript 其实也有属于自己的严格模式吗?

fly63.com版权所有,内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权,请与小编联系!情况属实本人将予以删除!

文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全