目的:设计模式众多,尝试记录下学到的不同设计模式的优劣,方便以后查阅。
前言:半年前看高程的时候看到设计模式这章,云里雾里,不是看不明白,而是不明白为啥要如此麻烦只为创建一个对象。直到最近完成了自己第一个小项目,才体会到当代码量多起来时没有适当的规范与限制是多么大的灾难。于是重新翻开高程,总结下几种我学到的简单设计模式的优劣。
正文:本文一共介绍7种设计模式以及他们的应用场景、优劣。
1.工厂模式
直接用函数来封装对象,将对象作为返回值。
function person (name,age) { var obj=new Object(); obj.name=name; obj.age=age; obj.sayName=function () { alert(this.name); }; return obj; } var me=person("Su",25);
缺点:对象识别的问题,所有创建出的对象都是Object的实例,不好区分。
2.构造函数模式
function Person (name,age) { this.name=name; this.age=age; this.sayName=function () { alert(this.name); }; } var me=new Person("Su",25);
优点:运用构造函数模式可以将实例标示为一种特定的类型。
缺点:创建的对象的方法都是私有的,如果只是想产生公用的方法,会造成不必要的性能浪费。
3.原型模式
利用原型链继承
function Person () {} Person.prototype.name="Su"; Person.prototype.sayName=function () { alert(this.name);} var me =new Person();
缺点:所有属性和方法被实例共享。当属性、方法中包含引用类型的值时,修改一个实例的属性、方法会影响所有其他实例。
4.原型+构造函数模式
私有属性、方法用构造函数产生,公有属性、方法用原型来继承。融合两种方法的优点。
function Person (name,age) { this.name=name; this.age=age; } Person.prototype={ constructor:Person, sayName:function () { alert(this.name); } } var me=new Person("Su",25);
缺点:注意引用类型值的原型继承。
ps:上图代码重写了Person构造函数的原型对象,将原型对象指针指向了一个对象,所以constructor属性此时指向Object而不是Person,所以要显式的将其设置成Person。
5.动态原型模式
本质上还是构造函数,只在指定方法不存在时在原型对象中添加他。
function Person (name,age) { this.name=name; this.age=age; if (typeof this.sayName!="function") { Person.prototype.sayName=function () { alert(this.name); } } } var me =new Person("Su",25);
缺点:不能使用对象字面量重写原型对象。因为这会使实例的指针指向新的原型对象。也就是说上图中原型对象中添加的sayName方法会失效。
6.寄生构造函数模式
调用时使用new操作符,除此以外我看不出和工厂模式有什么区别。望高人指点。
function person (name,age) { var obj=new Object(); obj.name=name; obj.age=age; obj.sayName=function () { alert(this.name); }; return obj; } var me=new person("Su",25); //这里使用new操作符
7.稳妥构造函数模式
没有公共属性,禁用this,仅暴露必须的API用于数据调用。适用于对安全有需求的领域。
function Person (name) { var o=new Object(); o.sayName=function () { alert(name); } return o; } var me=Person("Su");
如上代码,只能通过sayName方法才能访问到内部的name属性。
本文给大家介绍了七种设计模式,分别介绍了他们的优缺点,希望对学习js设计模式相关知识有所帮助。
在本节中,我们将探讨一些经典和现代的设计模式的JavaScript实现。 开发人员通常想知道在他们的工作流程中是否有一个(或一组)理想的模式。这个问题没有一个真正的单一答案:我们要完成的每个脚本和Web应用都可能会有它自己的独特需求,我们需要思考模式对实现来说在哪些方面能够提供真正的价值。 例如,有些项目可能很需要观察者模式提供的解耦(降低应用中各部分的彼此依赖)好处,但对其它根本不关切解耦的项目
本文向大家介绍初识Java设计模式适配器模式,包括了初识Java设计模式适配器模式的使用技巧和注意事项,需要的朋友参考一下 【正文】 我们知道,Android中最重要也是最难用的UI控件就是ListView列表控件,而要想灵活运用它,则必须要用到适配器adapter,所以,我觉得还是很有必要来学习一下Java当中的适配器模式(不管以后能不能用到),毕竟Java语言是Android开发很重要的一个基
本文向大家介绍javascript设计模式之module(模块)模式,包括了javascript设计模式之module(模块)模式的使用技巧和注意事项,需要的朋友参考一下 模块是任何强大应用程序中不可或缺的一部分,它通常能帮助我们清晰地分离和组织项目中的代码单元。 js中实现模块的方法: 1.对象字面量表示法 2.Module模式 3.AMD模块 4.CommonJS模块 5.ECMAS
设计模式是可重用的用于解决软件设计中一般问题的方案。设计模式如此让人着迷,以至在任何编程语言中都有对其进行的探索。 其中一个原因是它可以让我们站在巨人的肩膀上,获得前人所有的经验,保证我们以优雅的方式组织我们的代码,满足我们解决问题所需要的条件。 设计模式同样也为我们描述问题提供了通用的词汇。这比我们通过代码来向别人传达语法和语义性的描述更为方便。 本文我们将阐述JavaScript编程语言中经典
本文向大家介绍javascript设计模式之装饰者模式,包括了javascript设计模式之装饰者模式的使用技巧和注意事项,需要的朋友参考一下 在js函数开发中,想要为现有函数添加与现有功能无关的新功能时,按普通思路肯定是在现有函数中添加新功能的代码。这并不能说错,但因为函数中的这两块代码其实并无关联,后期维护成本会明显增大,也会造成函数臃肿。 比较好的办法就是采用装饰器模式。在保持现有函数及其内
本文向大家介绍javascript设计模式Constructor(构造器)模式,包括了javascript设计模式Constructor(构造器)模式的使用技巧和注意事项,需要的朋友参考一下 Constructor是一种在内存已分配给该对象的情况下,用于初始化新创建对象的特殊方法。Object构造器用于创建特定类型的对象–准备好对象以备使用,同事接收构造器可以使用参数,以在第一次创建对象时,设置成