星空网 > 软件开发 > Java

JS设计模式初探

目的设计模式众多,尝试用博客记录下学到的不同设计模式的优劣,方便以后查阅。

前言:半年前看高程的时候看到设计模式这章,云里雾里,不是看不明白,而是不明白为啥要如此麻烦只为创建一个对象。直到最近完成了自己第一个小项目,才体会到当代码量多起来时没有适当的规范与限制是多么大的灾难。于是重新翻开高程,总结下几种我学到的简单设计模式的优劣。

正文:本文一共介绍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设计模式初探

关键词:JS

JS
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

英国海关:https://www.goluckyvip.com/tag/11560.html
货物延误:https://www.goluckyvip.com/tag/11561.html
商务部报告:https://www.goluckyvip.com/tag/11562.html
外贸货物:https://www.goluckyvip.com/tag/11563.html
知无不言:https://www.goluckyvip.com/tag/11565.html
2022黑五:https://www.goluckyvip.com/tag/11566.html
【再放信号】美国Etsy即将放开中国卖家入驻,官方邮件你收到了吗?:https://www.kjdsnews.com/a/1836640.html
安庆市周边免费景点 安庆免费游玩的地方有哪些?:https://www.vstour.cn/a/365186.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流