JavaScript设计模式初探
作者:卡卡颂 发布时间:2024-07-08 06:23:14
目的:设计模式众多,尝试记录下学到的不同设计模式的优劣,方便以后查阅。
前言:半年前看高程的时候看到设计模式这章,云里雾里,不是看不明白,而是不明白为啥要如此麻烦只为创建一个对象。直到最近完成了自己第一个小项目,才体会到当代码量多起来时没有适当的规范与限制是多么大的灾难。于是重新翻开高程,总结下几种我学到的简单设计模式的优劣。
正文:本文一共介绍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设计模式相关知识有所帮助。


猜你喜欢
- 前言:WebDriver提供了两个关闭浏览器的方法,一个是前边使用quit()方法,另一个是close()方法close():关闭当前窗口q
- 一:unittest是python自带的一个单元测试框架,类似于java的junit,基本结构是类似的。基本用法如下: 1.用import
- python闭包关于闭包, 很多blog中都这样解释 :对于一个嵌套定义的函数,外层的函数的返回值是内层函数,而在内层函数中又引用了外层函数
- isnull在数据库查询中的应用,特别是再语句连接的时候需要用到 比如连接时候,某个字段没有值但是又要左连接到其他表上 就会显示空, isn
- 首先需要安装pyinstaller库。pip install pyinstallerexe程序打包步骤cmd 进入要编译的python文件所
- 本文实例讲述了scrapy自定义pipeline类实现将采集数据保存到mongodb的方法。分享给大家供大家参考。具体如下:# Standa
- 本文介绍一种将一个大的文本文件分割成多个小文件的方法方法一:1.读取文章所有的行,并存入列表中2.定义分割成的小文本的行数3.将原文本内容按
- 在Python中,正则表达式的group和groups方法是非常有用的函数,用于处理匹配结果的分组信息。group方法是re.MatchOb
- 本文实例为大家分享了Vue实现web分页组件的具体代码,供大家参考,具体内容如下效果演示源代码<!DOCTYPE html>&l
- Windows 10家庭中文版,Python 3.6.4,stomp.py 4.1.21ActiveMQ支持Python访问,提供了基于ST
- if条件分支1. if语句基本用法if boolean_value:子代码模块11)判断条件 boolean_value是if语句判断条件
- 1. 概述Promise对象是ES6提出的的异步编程的规范。说到异步编程,就不得不说说同步和异步这两个概念。从字面意思理解同步编程的话,似乎
- 一、函数介绍pytorch中两个张量的乘法可以分为两种:两个张量对应元素相乘,在PyTorch中可以通过torch.mul函数(或*运算符)
- 一 时间元组1. 时间元组和时间戳的互化import time,datetime# 获取当前时间的时间元组t = time.localtim
- 可是,其体积仍然很庞大。所以,在日常工作中,如何给SQL Server的备份文件瘦身,就是很多数据库管理员所关心的问题了。 也许微软的数据库
- 通过for循环求和,结果发现输出完全不一样,一个循环是输出每一步的结果,另一个循环是输出最终一次的结果,今天终于弄懂了。如下所示:补充:py
- 安装anaconda后查询CPU版本时打开Anaconda Prompt输入python然后输入import tensorflow as t
- 1、from子句组装来自不同数据源的数据; 2、where子句基于指定的条件对记录行进行筛选; 3、group&nb
- 如何计算 CPU 占用率?简单来说,进程的 CPU 占用率指的是 CPU 有多少时间花费在了运行进程上。在 Linux 系统里,进程运行的时
- 主要有五个方面:一..HTML页面转UTF-8编码问题二.PHP页面转UTF-8编码问题三.MYSQL数据库使用UTF-8编码的问题四.JS