js设计模式:工厂模式、构造函数模式、原型模式、混合模式
var o1 = new Object();o1.name = "宾宾";o1.sex = "男";o1.age = "27";o1.msg = function(){console.log("姓名:"+this.name+" 性别:"+this.sex+" 年龄:"+this.age);}var o2 = new Object();o2.name = "倩倩";o2.sex = "女";o2.age = "20";o2.msg = function(){console.log("姓名:"+this.name+" 性别:"+this.sex+" 年龄:"+this.age);}//调用对象下面方法o1.msg();o2.msg();//思考:如何让代码复用。//为了解决这个,引用一种设计模式:工厂模式。就是在函数内部创建一个对象,给对象赋予属性和方法,在将对象返回即可。
//工厂模式是软件工程领域一种广为人知的设计模式,而由于在ECMAScript中无法创建类,因此用函数封装以特定接口创建对象。其实现方法非常简单,也就是在函数内创建一个对象,给对象赋予属性及方法再将对象返回即可。function Person(name,sex,age){var o = new Object();o.name = name;o.sex = sex;o.age = age;o.getName = function () {console.log(this.name);}o.msg = function(){console.log("姓名:"+this.name+" 性别:"+this.sex+" 年龄:"+this.age);}return o;}var person1 = Person("彬彬","男","26");//var myArray=new Array();var person2 = Person("倩倩","女","26");person1.msg();person1.getName();person2.msg();//思考:我们创建的对象和系统对象有什么区别??//为了解决这个:我们需要在外面new一个函数就可以了,这就引出了js另一种设计模式:构造函数模式
//此模式特点:当new去调用一个函数,这个时候函数里面的this就是创建出来的对象,而且函数返回值直接就是this,这就叫隐式返回function Person(name,sex,age){this.name = name;this.sex = sex;this.age = age;this.getName = function () {console.log(this.name);}this.msg = function(){console.log("姓名:"+this.name+" 性别:"+this.sex+" 年龄:"+this.age);}}var person1 = new Person("彬彬1","男","26");var person2 = new Person("倩倩1","女","26");person1.msg();person1.getName();person2.msg();console.log(person1.msg == person2.msg);//false//思考:如何在提供性能??也就是让公用的属性和方法在内存中只存在一份??//解决问题方法:这里用到js设计模式中另外一种模式:原型模式。就是将公用的属性和方法加载在原型上(prototype)。
//原型(prototype)要写在构造函数下面。//原型相当于CSS中Class,普通方法和属性相当于标签元素里的style。所以原型的优先级要普通方法和属性。function Person(){}Person.prototype.name = "彬彬";Person.prototype.sex = "男";Person.prototype.age = "10";Person.prototype.msg = function(){console.log("姓名:"+this.name+" 性别:"+this.sex+" 年龄:"+this.age);}var person1 = new Person();person1.msg();var person2 = new Person();person2.name = "晃晃";person2.msg();//思考:这种修改属性比较麻烦???//解决问题方法:把属性写在构造函数内,方法采用原型模式写,着就叫JS混合的模式
function Person(name,sex,age){this.name = name;this.sex = sex;if(age){this.age = age; //优先级高于原型}}Person.prototype.age = 10;Person.prototype.getName = function(){console.log(this.name);}Person.prototype.msg = function(){console.log("姓名:"+this.name+" 性别:"+this.sex+" 年龄:"+this.age);}var person1 = new Person("彬彬1","男",80);var person2 = new Person("倩倩1","女");person1.msg();person1.getName();person2.msg();console.log(person1.msg == person2.msg);//true
js设计模式:工厂模式、构造函数模式、原型模式、混合模式的更多相关文章
- 设计模式之第9章-原型模式(Java实现)
设计模式之第9章-原型模式(Java实现) “快到春节了,终于快放假了,天天上班好累的说.”“确实啊,最近加班比较严重,项目快到交付了啊.”“话说一到过节,就收到铺天盖地的短信轰炸,你说发短信就发吧, ...
- .NET设计模式(6):原型模式(Prototype Pattern)(转)
概述 在软件系统中,有时候面临的产品类是动态变化的,而且这个产品类具有一定的等级结构.这时如果用工厂模式,则与产品类等级结构平行的工厂方法类也要随着这种变化而变化,显然不大合适.那么如何封装这种动态的 ...
- NET设计模式 第二部分 创建型模式(5):原型模式(Prototype Pattern)
原型模式(Prototype Pattern) ——.NET设计模式系列之六 Terrylee,2006年1月 概述 在软件系统中,有时候面临的产品类是动态变化的,而且这个产品类具有一定的等级结构.这 ...
- 设计模式(C#)——04原型模式
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 在软件开发过程中,我们习惯使用new来创建对象.但是当我们创建一个实例的过程很昂贵或者很复杂,并且需要创建多个这样的 ...
- C#设计模式学习笔记:(5)原型模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7640873.html,记录一下学习过程以备后续查用. 一.引言 很多人说原型设计模式会节省机器内存,他们说 ...
- Java 设计模式系列(五)原型模式
Java 设计模式系列(五)原型模式 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是选型模式的用意. 一.原型模 ...
- .NET设计模式(6):原型模式(Prototype Pattern)
):原型模式(Prototype Pattern) ); //使用颜色 string colorName = "red"; C ...
- 设计模式总结篇系列:原型模式(Prototype)
首先对原型模式进行一个简单概念说明:通过一个已经存在的对象,复制出更多的具有与此对象具有相同类型的新的对象. 在理解Java原型模式之前,首先需要理解Java中的一个概念:复制/克隆. 在博文< ...
- 设计模式之(六)原型模式(ProtoType)
认识原型模式 原型模式是比较简单的设计模式.废话不多说,直接看定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象.通过实例指定种类,种类就是初始化的类,然后通过拷贝创建对象.先展示一个 ...
- 设计模式学习-使用go实现原型模式
原型模式 定义 代码实现 优点 缺点 适用场景 参考 原型模式 定义 如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复 ...
随机推荐
- 友盟分享——Android App接入微信开放平台注意事项
一.Android第三方应用接入微信开放平台的注意事项: 1. 到微信开放平台官网申请正式的AppID(需通过审核),要填写包名.app签名的md5值.至于如何获取app签名信息,官方提供签名包apk ...
- HDU 1053 Entropy(哈夫曼编码 贪心+优先队列)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1053 Entropy Time Limit: 2000/1000 MS (Java/Others) ...
- Python 学习笔记(十)Python集合(二)
集合常用的方法 add() 向集合中增加一个元素,如果集合中已经有了这个元素,那个这个方法就会失效 >>> help(set.add) Help on method_de ...
- 【算法笔记】B1010 一元多项式求导
1010 一元多项式求导 (25 分) 设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为nxn−1.) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 ...
- 通过xshell在linux上安装mysql5.7(终极版)
通过xshell在linux上安装mysql5.7(终极版) 0)通过xshell连接到远程服务器 1)彻底删除原来安装的mysql 首先查看:rpm -qa|grep -i mysql 删除操作(一 ...
- [MYSQL][1]创建,修改,删除表
查看有哪些数据库: SHOW DATABASES; 创建,删除数据库: CREATE DATAABASE mydb; DROP DATABASE mydb; 查看有哪些表: SHOW TABLES; ...
- 判断ARP欺骗
转自http://bbs.51cto.com/thread-904594-1.html 网关是服务器或者单独主机设备的话 如果网关是服务器或者单独主机设备的话查询网关MAC地址要简单一些,我们只需要在 ...
- 增强for循环和迭代器
package example6; import java.util.ArrayList;import java.util.Iterator;import java.util.List; class ...
- 最完整的数据倾斜解决方案(spark)
一.了解数据倾斜 数据倾斜的原理: 在执行shuffle操作的时候,按照key,来进行values的数据的输出,拉取和聚合.同一个key的values,一定是分配到一个Reduce task进行处理. ...
- VMWare共享文件
windows与虚拟机的linux共享windows下的一个文件夹 1.重新安装VMware Tools,在VMware面板上选择“虚拟机-重新安装VMware tools…” 2.使用命令 Ctrl ...