前言

不管是哪门语言,千变万化不离其宗,深入理解其本质,方能应用自如。对应到js,闭包,原型,函数,对象等是需要花费大功夫思考、理解的。本文穿插了js原型和函数的相关知识,讨论了批量创建对象的几种方式以及它们的优缺点。
正文
说起创建对象,最容易想到的便是通过对象字面量方式直接定义一个对象吧,但这种方式只能创建少量,单独且相互间无联系的对象。若要批量创建对象,该如何?
工厂模式
工厂模式非常直观,将创建对象的过程抽象为一个函数,用函数封装以特定接口创建对象的细节。如下所示:
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语言约定俗成的规定,虽然大多数情况下不大写也不会报错,但是为了代码的规范性和可读性,还是应该将构造函数的首字母大写,与普通函数区别开。
与工厂模式相比,用构造模式创建对象有以下几点不同:
此外,还应注意到要创建Student的实例,必须要使用new操作符,创建的实例对象将有一个constructor(构造器)属性,指向Person构造函数。调用构造函数创建对象经过了以下几个过程:
构造函数虽好用,但也不是没有缺点。使用构造函数的主要问题是:每个方法都要在每个实例上创建一遍。在ECMAScript中,函数即对象,因此每定义一个函数,也就是实例化了一个对象。下面的例子证明了这个缺点。
var s3 = new Student('唐僧','male',3);
var s4 = new Student('白骨精','female',4);
s3.sayName();
s4.sayName();
console.log(s3.sayName == s4.sayName);
运行结果:
也就是说通过构造函数实例化的多个对象的方法,是多个不同的方法,但它们内部的代码以及实现的功能是相同的,这就造成了一定的资源浪费。
幸运的是,这个问题可以用原型模式来解决。
原型模式
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(); //Claiyre
var s6 = new Student_1();
s6.sayName(); //Claiyre
一张图胜过千言万语,下图清楚地阐释了各个对象和原型对象间的关系:
了解过原型后,可以继续在实例对象上增添属性或方法:
s6.name = 'John'; s6.sayName(); //John
当要读取某个对象的属性时,都会执行一次搜索,搜索首先从对象实例本身开始,如果在实例中找到了这个属性,则搜索结束,返回实例属性的值;若实例上没有找到,则继续向对象的原型对象延伸,搜索对象的原型对象,若在原型对象上找到了,则返回原型上相应属性的值,若没有找到,则返回undefined。因此,实例对象属性会覆盖原型对象上的同名属性,所以上面第二行代码输出的是John。
原型中的所有属性都是被所有实例所共享的,这种共享对于函数来说非常合适,对于包含基本值的属性也说的过去(实例属性会覆盖原型同名属性),但对于那些包含引用类型的属性,可有大麻烦了
Student_1.prototype.friends = ['aa','bb'];
console.log('s6的朋友' + s6.friends);
s5.friends.push('cc');
console.log('s5的朋友' + s5.friends);
console.log('s6的朋友' + s6.friends);
运行结果:
问题来了,我们只想改变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';
其他模式
除了以上几种常见的模式外,批量创建对象的方式还有
结语
每种模式都有各自的优缺点,具体要使用哪种,还需结合实际场景,深入理解,灵活运用。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# js
# 创建对象
# JS中的函数与对象的创建方式
# JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
# JavaScript创建对象的常用方式总结
# JavaScript创建对象的七种方式(推荐)
# 深入理解JavaScript创建对象的多种方式以及优缺点
# JS对象创建的几种方式整理
# 创建一般js对象的几种方式
# 详解js创建对象的几种方式和对象方法
# 多个
# 的是
# 都有
# 首字母
# 几种
# 一个函数
# 没有找到
# 自来
# 都是
# 这是
# 也就是说
# 唐僧
# 几个
# 也不
# 来了
# 放在
# 都要
# 不需要
# 约定俗成
# 则是
相关文章:
如何快速搭建高效WAP手机网站吸引移动用户?
营销式网站制作方案,销售哪个网站招聘效果最好?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
Java解压缩zip - 解压缩多个文件或文件夹实例
建站之星后台密码如何安全设置与找回?
长沙做网站要多少钱,长沙国安网络怎么样?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
利用JavaScript实现拖拽改变元素大小
网站制作新手教程,新手建设一个网站需要注意些什么?
XML的“混合内容”是什么 怎么用DTD或XSD定义
非常酷的网站设计制作软件,酷培ai教育官方网站?
如何在云服务器上快速搭建个人网站?
宝塔建站后网页无法访问如何解决?
在线教育网站制作平台,山西立德教育官网?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
贸易公司网站制作流程,出口贸易网站设计怎么做?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
建站之星展会模板:智能建站与自助搭建高效解决方案
无锡营销型网站制作公司,无锡网选车牌流程?
如何在Golang中指定模块版本_使用go.mod控制版本号
c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】
如何在宝塔面板创建新站点?
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
香港网站服务器数量如何影响SEO优化效果?
导航网站建站方案与优化指南:一站式高效搭建技巧解析
如何解决VPS建站LNMP环境配置常见问题?
高端建站三要素:定制模板、企业官网与响应式设计优化
建站之星后台密码遗忘或太弱?如何重置与强化?
php json中文编码为null的解决办法
外贸公司网站制作哪家好,maersk船公司官网?
如何撰写建站申请书?关键要点有哪些?
如何选购建站域名与空间?自助平台全解析
C++时间戳转换成日期时间的步骤和示例代码
宝塔面板如何快速创建新站点?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
如何在Windows服务器上快速搭建网站?
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
如何在IIS中新建站点并配置端口与物理路径?
建站之星会员如何解锁更多建站功能?
如何生成腾讯云建站专用兑换码?
百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?
寿县云建站:智能SEO优化与多行业模板快速上线指南
c++怎么用jemalloc c++替换默认内存分配器【性能】
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
如何通过WDCP绑定主域名及创建子域名站点?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
,购物网站怎么盈利呢?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
*请认真填写需求信息,我们会在24小时内与您取得联系。