代码解读面向对象的四种模式:工厂模式、构造函数模式、原型模式、混合模式_EGeek的博客-程序员秘密

技术标签: 推荐链接  javascript  

1. 工厂模式

(一)实现方法:在函数内创建一个对象并给对象赋予属性及方法,最终将对象返回。

function cPerson(name,sex,age){
    
 var o = new Object();
 o.name = name;
 o.sex = sex;
 o.age = age;
 o.show = function(){
    
 console.log(this.name,this.age,this.sex);
 }
 return o;
}
 var p1 = cPerson('瀚哲,'','18');
 p1.show();
 var p2 = cPerson('丑小鸭','女','18');
 p2.show();

(二)工厂方式的问题:使用工厂模式能够创建一个包含所有信息的对象,可以无数次的调用的这个函数。虽然其解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即如何得知一个对象的来源和类型),因此出现了构造函数。

2. 构造函数模式

(一)实现方法

function CPerson(name,sex,age) {
    
 this.name = name;
 this.sex = sex;
 this.age = age;
 this.show = function () {
    
 console.log(this.name, this.age, this.sex);
 }
}
var p1 = new CPerson('瀚哲 ','男','18'); 
 p1.show();
var p2 = new CPerson('丑小鸭','女','14');
 p2.show();

(二)构造函数与工厂模式的不同之处:

1.构造函数首字母大写

2.没有显式地创建对象

3.将属性和方法赋值给了 this 对象

4.没有return语句

(三)以这种方式来调用构造函数会大致经历以下几个步骤:

1.创建一个新的对象

2.将构造函数的作用域赋值给这个对象(因此this就指向了这个对象)

3.执行构造函数中的代码(即给新对象添加属性和方法的过程)

4.返回对象

(四)构造函数的问题:

1.使用构造函数的最大的问题在于每次创建实例的时候都要重新创建一次方法(理论上每次创建对象的时候对象的属性均不同,而对象的方法是相同的),然而创建两次完全相同的方法是没有必要的,因此,我们可以将函数移到对象外面;

2.在全局作用域中定义了许多仅供特定对象使用的方法,浪费空间,显然失去了面向对象封装性了,因此可以通过原型来解决此问题。

3. 原型模式

(一)实现方法: 创建的每个函数都有prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。使用原型对象的好处就是可以让所有对象实例共享它所包含的属性及方法。

function CPerson(){
    
}
CPerson.prototype.name='瀚哲'; 
CPerson.prototype.sex='男';
CPerson.prototype.age=100;
CPerson.prototype.show=function(){
    
 console.log(this.name, this.age, this.sex);
}
var p1 = new CPerson();
 p1.show(); //瀚哲 18 男 
var p2 = new CPerson();
 p2.show();//瀚哲 18 男 
 console.log(p1.show == p2.show)     //打印值为true

(二)原型模式的问题:

1.它省略了构造函数传递初始化参数这一环节,结果所有实例在默认情况下都取得了相同的属性值,这样非常不方便;

2.原型模式的最大问题在于共享的本性所导致,由于共享,因此一个实例修改了引用,另一个也随之更改了引用。因此我们通常不单独使用原型,而是结合原型模式与构造函数模式。

4. 混合模式

function CPerson(name,sex,age) {
    
     this.name = name;
     this.sex = sex;
     this.age = age;
     this.show();
}
CPerson.prototype.show = function(){
    
    alert(this.name + this.sex + this.age)
}
var CPerson1 = new CPerson("甄瀚哲","男",18);
var CPerson2 = new CPerson("丑小鸭","女",18);
CPerson1.show();
CPerson2.show();

混合模式中构造函数模式用于定义实例属性,而原型模式用于定义方法和共享属性。每个实例都会有自己的一份实例属性,但同时又共享着方法,最大限度的节省了内存。另外这种模式还支持传递初始参数。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41604269/article/details/106173429

智能推荐

javaSE学习02(数组)_我是展护卫的博客-程序员秘密

数组定义格式数组概述一次性声明大量的用于存储数据的标量,要存储的数据通常都是同类型数据什么是数组数组array是一种用于存储多个相同类型数据的存储模型数组定义格式格式一:数据类型[] 变量名 范例:int[] arr 常用格式二:数据类型 变量名[] 范例:int arr[]数组初始化初始化概述:初始化就是给数组中的元素分配内存...

SAAS多租户实现方案_springboot 实现多租户_基于数据库服务器隔离_或共享数据库服务器_但隔离数据库---springcloud工作笔记159_springcloud多租户独立数据库_脑瓜凉的博客-程序员秘密

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:1709331521.先来看看什么是saas? SaaS是Software-as-a-service(软件即服务)它是一种通过Internet提供软件的模式,厂商将应用软件统一部署在自己的服务器上,客户可以根据自己实际需求,通过互联网向厂商定购所需的应用软件服务,按定购的服务多少和时间长短向厂商支付费用,并通过互联网获得厂商提供的服务。用户不用再购买软件,而改用向提供商租用基于Web的软件,来管理..

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull)_安卓开发必须用到xml吗_跃睿的博客-程序员秘密

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析xml的这三种方式进行一次总结。     今天解析的xml示例(channels.xml)如下:xml version="1.0" encoding="utf

引用libuv需要的头文件和lib库_玄冬Wong的博客-程序员秘密

需要3个头文件:uv.htree.huv-win.h3个头文件需要同时加入工程,在自己的代码中只需要包含uv.h一个头文件即可 再需要4个lib依赖(windows,libuv v0.10版本):#pragma comment(lib, "libuv.lib")#pragma comment(lib, "Ws2_32.lib")#pragma comment...

C++中定义一个函数为bool类型的作用_c++ bool_&Mr.Gong的博客-程序员秘密

1.bool型函数bool型函数(即返回值为bool类型的函数)的作用——获取函数返回值bool getvalue(bool b){ if(b == true) return true; else return false;}int main(){ //在main()中调用函数就可以得到5261函数的返回结果4102 cout<<boolalpha<<getValue(true); return 0;

docker开启mysql没有文件夹_docker 修改mysql配置导致 mysql容器启动失败解决办法_weixin_39582724的博客-程序员秘密

问题:1. 修改了容器/etc/mysql/my.cnf文件2.增加sql_mode,由于配置不正确,重启后mysql报错,容器启动失败,如下图3.或者使用docker logsmysql-test命令查看解决:win10直接使用cmd即可,使用docker cp命令把容器中的配置复制下来,然后复制一个新的my.conf替换错误的文件即可1. 首先查看容器id或names2.复制配置文件到...

随便推点

Go入门(一)_沧海一声笑·rush的博客-程序员秘密

文章目录一.到官网下载二.运行三. 基础用法3.1目录结构3.2 变量声明3.3 不同变量的声明一.到官网下载官网https://golang.google.cn/doc/install?download=go1.16.windows-amd64.msi配置 go 语言的运行环境,内容较多,不再累赘。如果使用 vs core 编译,需要安装相应的插件。二.运行输入如下代码package mainimport "fmt"func main() { fmt.Println(

ros服务---胡春旭_胡春旭ros教程_野生蘑菇菌的博客-程序员秘密

一、自定义服务数据和话题类似,首先要新建文件夹srv,然后在里面添加数据。xml文件因为之前定义话题数据时已经设置,因此只需要在cmakelists中添加新建的服务项就可以。二、服务程序首先要定义回调函数,回调函数的返回时布尔型,真正需要的数据,还是在client定义的对象中获取。然后定义主函数,在主函数中定义定义基本的初始化,以及实例一个服务,等待回调函数。三、客户端程序首先需要检查终端输入的数据是否符合规则,然后实例一个客户端,再和话题类似,实例一个服务代码中定义的标准的数据对象,然后将终

delphi真的穷途末路了! 不变程序员的苦难和热爱的精神。_程序员已经穷途末路了吗_鹧鸪菜的博客-程序员秘密

建立一个自动编号字段,系统并没有建立一个序列,先填写一条,再删掉就行了。http://hi.baidu.com/itgorgon/item/bec2a816c58954fd756a84cdhttp://hi.baidu.com/itgorgon/item/c4c11d0e8b797227a0312dc6Borland公司连丢大将,delphi真的穷途末路了!

零基础学3D建模,可信吗?_零基础学3d建模靠谱吗_3D游戏建模入门的博客-程序员秘密

单纯学建模的还好,只是对透视和结构的把握,比受过专业训练的慢一些。如果只是兴趣爱好,没什么问题,自己网上找找免费教程,自娱自乐没问题,能做出来就行,不需要做到多好程度,没有美术基础照样能做。如果想深入发展作为一种职业,从事行业建模行业,需要审美和造型能力,这些能力是建立在美术基础上。3D建模是笼统概念,细分很多种,深入发展不是指一味做模型,而是具有核心竞争力,建模的同时还会独立设计,单纯只会做模型,不会设计和思考,没有发展可言。国内大部分游戏建模师的本质是流水线工人,把已有设定尽可能还原,不需要会设

log4j2配置详解(节点和输出格式)_log4j2 loggers_米二的博客-程序员秘密

本文章主要详细介绍(java版)log4j2的配置!!目录一.配置文件节点解析    二.输出格式详解:三.模版一.配置文件节点解析      1.根节点Configuration            根节点Configuration有两个属性:status和monitorinterval,有两个子节点:Appenders和Loggers(表明可以定义多个Append...

jsp内置对象(pageContext、request、session、application),cookie与session_m0_46163291的博客-程序员秘密

在eclipse中创建的动态web工程下,WEB-INF中的文件,无法通过客户端(浏览器)直接访问,只能通过请求转发来访问。注意:不是所有的内部跳转都能访问WEB-INF,只有请求转发可以,重定向不能访问。JSP的页面元素:a.脚本i.<%局部变量、Java语句%>ii.<%!全局变量、定义方法%>iii.<%=输出表达式%>输出表达式和out.print()是等价的,即out.print(“hello”)等价于<%=“hello”%>

推荐文章

热门文章

相关标签