问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

理解JS的prototype

发布网友 发布时间:2024-10-03 22:10

我来回答

1个回答

热心网友 时间:2024-11-18 10:24

起初学习前端时,我对JavaScript的prototype概念感到困惑。如今,当我深入理解了JavaScript之后,我将分享关于prototype的见解。

什么是prototype?JavaScript最初被设计为一种简单的网页脚本语言。在ES6之前,JavaScript没有Class的概念,所有的数据类型都是对象。为了实现实例对象的属性和方法共享,JavaScript为function引入了prototype的概念。prototype是一个对象。它是如何工作的呢?简单来说,JavaScript是一种基于原型的语言。当我们调用一个对象的属性时,如果对象没有该属性,JavaScript解释器就会从对象的原型对象上去寻找该属性,如果原型上也没有该属性,那就继续找原型的原型,直到最后返回null为止,null没有原型。这种属性查找的方式被称为原型链(prototype chain)。

当我们直接在控制台输出objA时,返回:

可以看出,该实例对象有3个属性,其中并没有methodB。这就是方法在构造函数内声明和在原型上声明的区别之一。将proto展开,发现mehtodB在这里。

Object.prototype的proto属性是一个访问器属性(一个getter函数和一个setter函数),它公开访问它的对象的内部[[Prototype]](对象或null)。proto的使用是有争议的,尽量不要使用。它从来没有被包括在EcmaScript语言规范中,但是现代浏览器实现了它。proto属性已在ECMAScript 6语言规范中标准化,用于确保Web浏览器的兼容性,因此它未来将被支持。它不赞成使用Object.getPrototypeOf / Reflect.getPrototypeOf和Object.setPrototypeOf / Reflect.setPrototypeOf(如果关注性能的话,应该避免设置对象的[[Prototype]]这样缓慢的操作)。

那么这样写有什么好处呢?现在我们再实例化一个objB对象出来:

和objA是不是长得一样,其实他们并不是相等的。

可以发现,methodA返回的是false,methodB是true。

把方法写在构造函数的内部,增加了通过构造函数初始化一个对象的成本(内存占用,因为两个实例对象就创建了两个一样的methodA),把方法写在prototype属性上就有效的减少了这种成本(它们指向了同一个methodB)。你也许会觉得,调用对象上的方法要比调用它的原型链上的方法快得多,其实并不是这样的,如果你的那个对象上面不是有很多层原型的话,它们的速度其实是差不多的。

从上面的例子可以看出,这种重复性的方法就可以写在原型中,当你的构造函数有相当多的方法,并且实例化也非常多时,提升是非常大的。在前端入门时必须掌握的一个框架就是jQuery,其实你每次调用$(“…”)时,都会返回一个实例化的新的jQuery对象出来(内部帮你执行了new方法,关于jQuery初始化这一段也是jQuery的精髓之一,实现的相当巧妙,有兴趣可以去看看),这样做既没有使实例对象私有属性相互影响(如上面的propA),又能共用方法(如上面的methodB)。

JavaScript 是基于原型的语言。想想我们是怎么创建新对象的:var obj = {}其实最终是通过var obj = new Object()创建的。是不是和上面的例子很像:通过new 构造函数 生成一个对象。当我们创建一个对象后,就可以通过“点”方法名的方式调用一些并不是我们手写的方法了,如obj.toString()。

其实我们调用的是Object.prototype.toString。现在是不是对JavaScript 是基于原型的语言这句话有些理解了。其实不止Object是这样的,Array、String、Number等都是这样的原理。

是不是很神奇,居然全等。想想这是为什么?还记得上面说的原型链吗?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
水笔在手上画画会不会被衣服搽掉下来 老人每天大便次数很多量不多也不稀,每天还会拉三四次水应经三个月了... 从大连飞机场怎么去大连经济开发区5彩城K区的大连金港大酒店 除了打 ... 请问从大连周水子国际机场到经济技术开发区怎么走最省钱? 中国古代名刀总录中国古代十大名刀 怎样把qq安装到iphone里面 苏科大什么梗 苏科大叫什么名字 lol苏科大是苏州科技大学的吗 lol苏州科技大学为什么这么厉害 优尔精医用降温贴是不是保健品? ...用什么队伍练级好[图]-手游攻略-游戏鸟手游网 天龙八部3武当走单属性好还是双属性好,武当高手来 天龙八部冰玄双修的全三武当怎么打宝石???求会玩武当的大大们 天龙八部冰玄双修武当怎么打宝石? QQ2009中如何放大自己和对方的QQ秀 QQ头像和QQ秀在不同版本的QQ上显示不一样? 急 我的QQ失灵??? ...登陆需要的时间也久了,自己的QQ秀也没有显示,怎么回事? 装完qq2009sp4后所有好友的qq秀都看不到了,全是一片空白。 QQ2009无法显示QQ秀 QQ2009最新版本不显示QQ秀 为什么在快手上,我关注一位女的,那女的有些视频我为什么收不到,反而... ...自己的qq秀和和自定义头像都显示不出来,都变成最原始的头像了... 茶马古道的历史发展介绍 茶马旧道滇川藏汗青大通道 茶马古道的传说故事 南方的“末了马帮”茶马旧道 为什么我的QQ现在不能显示自定义头像?我下载的是2007最新版的 QQ自己和别人还有群的自定义头像看不到是怎么回事 茶马古道 云南马帮 JS里为什么在原型里面设置CSS属性(this.elements是节点元素),style... 防弹少年团,这个绿色头发是谁。 防弹少年团 血汗泪里褐色头发的叫什么 有什么好看的字体 “空中乘务员”的英语写法 如何解决联通停机实名认证? 联通如何实名认证 原来代售点没了 请问一下土木工程道桥方向考研究生选择哪个学校比较好一点,我现在就读... 土木工程考研 道桥方向 有什么推荐 本来学习中等 全国土木工程道桥方向的大学一共有多少所?分别是那几所啊?考哪个学校的... 什么是保单贷,保单贷怎样申请 保单贷是属于什么贷 世界上最危险的人书籍 江苏警官学院是一个什么样的学校? syntactic approach to pattern recognition的意思 怎样做非主流人物闪图? 非主流图片制作软件那里有下啊?要求无毒无马安全绿色软件 我怎么能把我自己的照片变成非主流闪图呢? 非主流闪图怎么弄出来滴 非主流的真正含义究竟是什么拜托各位大神