创建对象的模式
时间:2020-05-22
本文章向大家介绍创建对象的模式,主要包括创建对象的模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.工厂模式
function createPerson(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name); } return o; } let person=createPerson('susu',20,['学生','打字员','程序员'])
优点:解决了创建多个相似对象时,代码的复用问题
缺点:不能知道对象的类型
2.构造函数模型
只要一个函数是通过new来调用的,我们就把它称为构造函数,在js中函数也是一个对象
function createPerson(name,age,job){ this.name=name; this.age=age; this.job=job; this.sayName=function(){ alert(this.name); } } let person1=new createPerson('susu',20,['学生','打字员','程序员'])
let person2=new createPerson('feifei',23,['学生','打字员','程序员'])
优点:解决了工厂模式中对象类型无法识别的问题,并且创建自定义的构造函数意味着将来可以将它的实例标识为一种特定的类型。
缺点:如果对象属性中包含函数的话,那么我们每次实例话的时候都会新建一个函数对象,浪费了不必要的内存空间
3.原型模式
我们创建的每一个函数都有一个 prototype 属性,这个属性指向函数的原型对象,这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。我们通过使用原型对象可以让所有的对象实例共享它所包含的属性和方法,
function createPerson(){} createPerson.prototype.name='susu'; createPerson.prototype.age=19; createPerson.prototype.job=['学生','打字员','程序员']; createPerson.prototype.sayName=function(){ alert(this.name); } let person1=new createPerson() let person2=new createPerson()
优点:解决了构造函数模式中多从创建相同函数对象的问题
缺点:省略了传参过程。所有实例都共享一组属性,若属性中包含引用类型,属性的操作不独立,会导致读写混乱
4.组合构造函数模式和原型模式
是目前使用最广泛,认同度最高的一种创建自定义类型的方法。
function createPerson(name,age){ this.name=name; this.age=age; } createPerson.prototype={ constructor:createPerson, sayName:function(){ alert(this.name); } } let person1=new createPerson('susu',19) let person2=new createPerson('feifei',23)
缺点:代码的封装性不好
5.动态原型模式
在构造函数中通过判断只初始化一次原型
function createPerson(name,age){ this.name=name; this.age=age; if(typeOf this.sayName!=='function'){ createPerson.prototype.sayName=function(){ alert(this.name) } } } let person1=new createPerson('susu',19) let person2=new createPerson('feifei',23)
6.寄生构造函数模式
创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后返回新创建的对象。
function createPerson(name,age,job){ var o=new Object(); o.name=name; o.age=age; o.job=job; o.sayName=function(){ alert(this.name); } return o; } let person=new createPerson('susu',20,['学生','打字员','程序员'])
缺点:和工厂模式缺点一样
原文地址:https://www.cnblogs.com/susu2020/p/12937793.html
- 【专业技术】Python爬虫:抓取手机APP的传输数据
- 海量数据迁移之传输表空间(一) (r5笔记第71天)
- 一条sql语句的改进探索(r5笔记第70天)
- 【专业技术】Node.js 究竟是什么?
- Github 项目推荐 | 用 Pytorch 实现的 WaveNet-Vocoder
- 重启数据库的一场闹剧(r5笔记第68天)
- 【C语言系列】基础语法案例分析(初级篇)
- 一次ORA-00600问题的排查和分析(r5笔记第64、65天)
- SpringMVC入门就这么简单
- pl/sql中的forall简单测试(r5笔记第63天)
- SpringMVC【开发Controller】详解
- 巧用外部表备份历史数据(r5笔记第62天)
- Github 项目推荐 | 最小化类 AlphaGo Zero 引擎 —— Nochi
- 半自动化运维之快速连接到指定环境(一) (r5笔记第61天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Mac之vim普通命令使用
- selenium库的基本使用
- 高效大数据开发之 bitmap 思想的应用
- 从0到1实现一个虚拟DOM
- Xenomai XDDP example and Posix Compling
- 项目实践|基于Flink的用户行为日志分析系统
- 手把手教你用Matplotlib画一个小清新配色的商业图表
- 高并发场景下锁的使用技巧
- Struts2第四天:Struts2的拦截器和标签库
- kubernete编排技术八:使用operator管理有状态应用
- Spring第一天:Spring的概述、SpringIOC入门(XML)、Spring的Bean管理、Spring属性注入
- Flink的处理背压原理及问题-面试必备
- Spring第二天:Spring的IOC的注解方式、Spring的AOP开发(XML)
- OpenCV还能实现这种效果? | 视频防抖技术
- 迁移到 Go Modules