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

深入理解JavaScript原型与原型链(GIF预警)

发布网友 发布时间:2024-09-17 08:41

我来回答

1个回答

热心网友 时间:2024-10-30 03:37

前言

本文主要围绕下述代码进行讲解,Person是构造函数,p是Person实例化的对象。

functionPerson(name){this.name=name}letp=newPerson('瑾行')

动图预警

下面一起来逐步拆解GIF动画,完成最后的连线。?

显示原型

prototype称作显式原型,每一个函数(除箭头函数)在创建后都拥有prototype的属性,指向函数的原型对象。

prototype的设计之初是为了实现继承,让构造函数创建的实例共享共有的属性和方法,无需重复创建。

functionPerson(name){this.name=name}Person.prototype.getName=function(){console.log(this.name)}letp=newPerson('瑾行')letp1=newPerson('七金')p.getName()//瑾行p1.getName()//七金

理解了,就把prototype相关的线先连起来。Object与Function均是Javascript内置的对象,后面细讲。

constructor属性

存在每个函数(除箭头函数)显示原型中,是当前函数的引用。

打印下对象p的constructor属性。

console.log(p.constructor)//fPerson(){}

意料之中,是Person构造函数。但注意p本身没有constructor属性,是从原型上继承的,所以不需画线。我们都知道Javascript中函数也是对象,那么打印下Person的constructor属性。

console.log(Person.constructor)//?Function(){[nativecode]}

从打印结果可以知道Person函数的构造函数是Function。敲黑板!知识点:我们所有的函数都是根据newFunction()生成的。

newFunction([arg1[,arg2[,...argN]],]functionBody)

functionPerson(name){this.name=name}//等价于letPerson=newFunction(name,'this.name=name')

根据知识点,打印Object、Function的constructor属性。

console.log(Object.constructor,Function.constructor)//?Function(){[nativecode]}?Function(){[nativecode]}

根据打印结果:Function是所有函数的构造函数(包括自己),且所有函数的constructor均继承于Function.prototype,同样无需画线。还有一种情况,函数的显式原型。根据定义,毋庸置疑,constructor指向自身函数。

console.log(Person.prototype.constructor)//?Person(){}

同理可得出Object.prototype.constructor与Function.prototype.constructor

懂了的话,按讲解顺序连上与constructor相关的线。

隐式原型

__proto__称作隐式原型,所有的对象都具有__proto__属性。对象的隐式原型指向了该对象构造函数的原型对象,保证对象能访问挂载在原型链上定义的属性和方法。

p是Person构造函数实例化的对象,所以p.__proto__===Person.prototype为true,保证p可访问Person原型上定义的属性和方法。

console.log(p.__proto__===Person.prototype)//true

函数也是对象,上1小节了解到Function是所有函数的构造函数

console.log(Person.__proto__===Function.prototype)//trueconsole.log(Object.__proto__===Function.prototype)//trueconsole.log(Function.__proto__===Function.prototype)//true

函数的显示原型也是对象,是Object构造函数产生。

console.log(Person.prototype.__proto__===Object.prototype)//trueconsole.log(Function.prototype.__proto__===Object.prototype)//true

构造函数Person的显式原型也是对象,所以我们尝试打印下它的隐式原型。现在,我们可以得出结论:所有的对象都继承于Object.prototype。不信的话,打印下Object.prototype.__proto__

functionPerson(name){this.name=name}Person.prototype.getName=function(){console.log(this.name)}letp=newPerson('瑾行')letp1=newPerson('七金')p.getName()//瑾行p1.getName()//七金0

现在,让我们把剩下关于__proto__的线连好,*完成!!!

原型链

如果看到这里,你应该知道原型链由__proto__将对象和原型连接起来组成原型链?。

面试高频问题

题目:instanceof与isPrototypeOf有何区别?

instanceOf:检测构造函数的prototype是否出现在某个实例对象的原型链上。isPrototypeOf:检查原型对象是否存在于某个实例对象的原型链上。

functionPerson(name){this.name=name}Person.prototype.getName=function(){console.log(this.name)}letp=newPerson('瑾行')letp1=newPerson('七金')p.getName()//瑾行p1.getName()//七金1

根据定义和代码可以的得出结论:两者具备相同的作用,但主要目标对象不同,instanceOf目标对象是构造函数,isPrototypeof则是原型对象。

总结

如果读到这里,我相信你至少会用画图地形式去描述原型与原型链,那就毫不吝啬地点个赞吧?。

作者:瑾行著作权归作者所有。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
韩国EMS19.3公斤的箱子去中国要多少钱 俄罗斯快递查询 青春期孩子想买贵东西怎么办 发现青春期孩子买成人用品怎么办?? ...运送石油到中国上海湾,途中经过的海峡有( )A.白令海峡B.马六甲海峡C... 中俄货物运输企业 ...湾往我国运送石油的船只需要经过的海峡是: ( ) A.直布罗陀海峡 B... 童心唱响祖国完整版歌词【26句精选】 苹果有面容和没面容有什么区别 苹果无面容影响 深入理解JavaScript的prototype 迈克尔.杰克逊总资产有多少? 多少分能考上安徽理工大学 如何限制孩子玩手机游戏时间 长江大学和安徽理工大学哪个好 非智能机怎么定时20分钟一响 离婚后发现孩子非亲生,那么赠与她的房屋能要回吗? 房子过户二十年了原房主前妻能要回房子吗 ...把房子留给前妻和儿子了,我现在没地方住,我能要回房子 ...前妻生活我给而买了房子入果我是追回房子可以吗? 前妻说回来一起,但转了钱给她后反悔,这样可以告他吗? excel如何设置数据选择器,只有一个输入端? vivo手机充电时发热过高是什么原因? 4个字励志对联 肱骨之城和股肱之臣股肱之臣 肱骨之臣和股肱之臣有什么区别 肱骨之臣和股肱之臣有哪些不同 自考本能不能考高中教师资格证呢 自考生的学历有资格当老师吗 2024年自考本科可以报考高中教师资格证吗 三星i9003怎么把桌面的图标弄下去,除了屏幕底下的电话。联系人。信息... JavaScript语言精髓与编程实践(第2版)目录 深入浅出JavaScript基本信息 JavaScript中函数的使用 请问javascript中参数的作用是什么? 知名沉浸式文旅项目供应商有哪些?想做一下文化ip和地域特色结合打造这 ... 徐州市医疗保险一年要交多少钱 继续教育学院有什么优势吗? 北京中央民族大学自考部在什么地方 有什么软件可以制作手机铃声? 峥 字是什么意思? 我需要很大气很有战斗气氛的背景音乐,请知道的报上歌名或连接地址,很感... MySQL列授权详解如何限制用户对特定列的访问权限mysql一列授权 mySQL授权问题 MySQL用户授权如何创建新用户并授权mysql中创建用户授权 授权拥有MySQL正版授权保障服务器安全mysql正版 授权MySQL安全可靠的正版授权mysql正版 myeclipse连接mysql授权失败 什么是脉冲压缩? 一文搞懂雷达脉冲压缩和匹配滤波器 脉冲压缩(关键技术)