解析原型链原型链是JavaScript语言设计中非常有趣的方面之一。在解析原型链之前,我们需要了解以下重要概念。构造函数构造函数是一个特殊的函数。通常约定函数名的首字母需要大写,并且必须通过new运算符调用(与普通函数有本质区别)。它的作用是用来创建特定类型的对象。JavaScript中也有一些原生的构造函数,比如Object、Array、Function等。实例每当new运算符调用构造函数时,都会创建一个新对象。这个过程称为实例化。这个对象称为实例。也就是说,任何对象都是一个实例,但关键是谁创建这个实例的构造函数?而它的原型是谁呢?原型构造函数内部有一个特殊的属性prototype,它指向一个对象,是的,它的原型又被称为原型对象。原型对象是一个很特殊的存在。每当构造函数实例化一个对象时,这个实例的[[Prototype]]默认会指向构造函数的原型。实例对象可以通过它的[[Porototyoe]]属性找到原型对象,而原型对象可以通过自己的constructor属性找到哪个构造函数创建了实例。(注意,很多浏览器会将属性[[Prototype]]替换为属性__proto__。)构造函数、实例和原型值之间的关系为了进一步明确构造函数、实例和原型之间的关系,我们可以借鉴下面这张图开始实例dog通过其[[Prototype]]属性找到原型Dog.prototype,构造函数Dog通过自身的prototype属性找到原型Dog.prototype,原型Dog.prototype通过它的属性找到构造函数Dog自己的构造函数属性实例dog通过constructor属性找到构造函数Dog。对于实例dog,构造函数Dog是通过constructor属性找到的。这个过程不使用实线箭头吗?这里的细节是什么🤔,让我们看一段简单的代码和一张图片functionDog(name){this.name=name;}letdog=newDog("cheems");从代码结合图片不难发现,实例狗是没有constructor属性的,但是原型对象有这个属性,那么实例如何获取这个属性呢?🤔,这就涉及到了JavaScript中的一种特殊行为——委托,下面我们就来看看什么是委托。委托当我们尝试获取对象的某个属性值,但对象不具有该属性时,JavaScript将尝试从原型对象中获取属性值。如果原型对象没有该属性,则从它的原型中寻找,以此类推,直到最终流程到达终点Object.prototype,如果仍然没有找到,则返回undefined。这个过程称为委托。现在你明白了,实例狗是通过委托找到自己的构造函数的。明白了这一点,原型链就准备出来了。如果原型链在第一个对象上没有找到所需的属性或方法引用,引擎将继续搜索其[[Prototype]]指向的对象。同样,如果后者没有找到需要的引用,它会继续寻找它的[[Prototype]],以此类推,直到找到Object.prototype。这一系列对象的链接称为原型链。我们可以用一张图来说明,既然构造函数也是一个对象,那么它也有一个构造函数和一个原型。构造函数的原型是实例的原型,而不是它自己的原型。自定义构造函数也需要使用[[Prototype]]找到原型,然后找到并创建自己的构造函数——即原生构造函数Function,但请注意,原生构造函数Function的[[Prototype]]指向功能。原型。console.log(Function.__proto__===Function.prototype);//true可以沿着原型链查找所有原型对象,直到找到最后一个原型对象Object.prototype,然后向上查找Object.prototypeNull,使用表示这里没有对象。总结充分理解原型链是理解JavaScipt语言的重要环节之一,对于理解JavaScript继承的实现也有很大的帮助。如果你已经把原型链整理的差不多了,下一篇文章我将带你走近JavaScript继承的世界。最后,关于JavaScript原型链的分享到此结束。如果您在阅读本文后对JavaScript的原型链有了更深入的了解和理解,欢迎给作者点个赞和鼓励一下😄!您的支持是我继续分享JavaScrit知识的动力,感谢您阅读本文
