博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS中创建对象的几种设计模式
阅读量:7249 次
发布时间:2019-06-29

本文共 2709 字,大约阅读时间需要 9 分钟。


工厂模式

  • 定义:工厂模式非常直观,将创建对象的过程抽象为一个函数,用函数封装以特定接口创建对象的细节。通俗地讲,工厂模式就是将创建对象的语句放在一个函数里,通过传入参数来创建特定对象,最后返回创建的对象。
  • 缺陷:工厂模式虽然可以创建多个相似的对象,但却不能解决对象标识的问题,即怎样知道一个对象的类型(如下,我只知道s1是Object--万物皆对象,但我并不知道s1到底是Student类型还是Person类型?就好像是一个孤儿一样,只能知道他是个人,但不知道他是哪家人。。。)
function createStudent(name,sex,grade){                                                             var o = new Object();    o.name = name;    o.sex = sex;    o.grade = grade;    o.sayName = function(){        console.log(this.name);    }    return o;}var s1 = createStudent('Claiyre','famale',1);

构造函数模式

  • 定义:构造函数模式是java语言创建对象的通用方式。(但两种语言用构造函数创建对象的方式略有不同)
  • 在JavaScript中没有类的概念,函数即为一等公民,因此,不必显式声明某个类,直接创建构造函数即可,类的方法和属性在构造函数中(或原型对象上)处理。
function Student(name,sex,grade){                                                       this.name = name;    this.sex = sex;    this.grade = grade;    this.sayName = function(){        console.log(this.name);    }}var s2 = new Student('孙悟空','male',2);
  • 注意:构造函数的函数名首字母是大写的,而普通函数首字母则是小写,这是众多OO语言约定俗成的规定,虽然大多数情况下不大写也不会报错,但是为了代码的规范性和可读性,还是应该将构造函数的首字母大写,与普通函数区别开。
  • 优势:与工厂模式相比,用构造模式创建对象有以下几点不同:

    • 没有显示地创建对象
    • 直接将属性和方法赋给this对象
    • 没有return语句
  • 缺陷:每个方法都要在每个实例上创建一遍:在ECMAScript中,函数即对象,因此每定义一个函数,也就是实例化了一个对象。通过构造函数实例化的多个对象的方法,是多个不同的方法,但它们内部的代码以及实现的功能是相同的,这就造成了一定的资源浪费。

原型模式

  • 定义:js中,每个函数都有一个prototype属性,它指向一个对象,叫做原型对象,原型对象包含了可以由特定类型的所有实例对象共享的属性和方法。此外,这个对象有一个与生自来的属性constructor,指向创建对象的构造方法。使用原型模式可以让所有的实例共享原型对象中的属性和方法,也就是说,不必再构造函数中定义对象实例的信息。
function Student_1(){}Student_1.prototype.name = 'Claiyre';Student_1.prototype.sex = 'female';Student_1.prototype.class = 5;Student_1.prototype.sayName = function (){    console.log(this.name);}var s5 = new Student_1();                                                         s5.sayName();    //Claiyrevar s6 = new Student_1();s6.sayName();    //Claiyre
  • 引申知识点:

    • Object.getPrototypeOf(object)方法返回参数对象的原型对象。
    • Object.keys(object)方法返回对象上枚举的实例属性。
  • 缺陷:原型中的所有属性都是被所有实例所共享的,这种共享对于函数来说非常合适,对于包含基本值的属性也说的过去(实例属性会覆盖原型同名属性),但对于那些包含引用类型的属性,可有大麻烦了:
Student_1.prototype.friends = ['aa','bb'];console.log('s6的朋友' + s6.friends); // s6的朋友aa,bbs5.friends.push('cc');console.log('s5的朋友' + s5.friends); // s5的朋友aa,bb,ccconsole.log('s6的朋友' + s6.friends); // s6的朋友aa,bb,cc// 我们只想改变s5的朋友列表,但由于原型模式的共享本质,s6的朋友列表也随之改变了

组合使用构造函数和原型模式

  • 定义:构造函数模式用于定义实例属性,原型模式则用于定义方法和共享的属性。这种混合模式不仅支持向构造函数传入参数,还最大限度地节约了内存,可谓是集两模式之长。
function Student(name,sex,grade){                                                       this.name = name;    this.sex = sex;    this.grade = grade;}Student.prototype.sayName = function(){        console.log(this.name);}Student.prototype.school = 'Joooh school';

其他模式

除了以上几种常见的模式外,批量创建对象的方式还有

  • 动态原型模式:仅在第一次调用构造函数时,将方法赋给原型对象的相应属性,其他示例的处理方式同构造函数模式
  • 寄生构造函数模式:仅仅封装创建对象的代码,然后再返回新创建的对象,仍使用new操作符调用
  • 稳妥构造函数模式:没有公共属性,只有私有变量和方法,以及一些get/set方法,用以处理私有变量

转载地址:http://wlhbm.baihongyu.com/

你可能感兴趣的文章
企业服务经验总结--服务器安全细则2
查看>>
python中时间的加n和减n运算
查看>>
软件开发人员应具备的基本素质 !!!
查看>>
无线运维——J2ME和WAP运维方式的优缺点
查看>>
生产环境Shell脚本Ping监控主机是否存活(多种方法)
查看>>
关于SQLServer2000中触发器的使用——多行数据提交
查看>>
commons-fileupload 1.3.1 上传测试
查看>>
红帽集群套件RHCS四部曲(概念篇)
查看>>
TFS配置(二)
查看>>
GeoServer地图开发解决方案(五):基于Silverlight技术的地图客户端实现
查看>>
Android应用程序键盘(Keyboard)消息处理机制分析(3)
查看>>
Linux上连接Microsoft SQL Server 2005
查看>>
私有云管理-Windows Azure Pack
查看>>
Linux下文件和目录的颜色代表的含义
查看>>
Forefront Client Security服务器部署
查看>>
Crystal Reports中的字段
查看>>
一个例子探究jQuery的Ajax应用(二)
查看>>
PPT of "SharePoint 2007 网站性能优化"
查看>>
爪哇国新游记之三十四----Dom4j的XPath操作
查看>>
node17
查看>>